在多个动态链接库的解决方案中,每次基本上只有一个单独的库“MyLibrary.dll”会发生堆损坏,但不能说“MyOtherLibrary.dll”。 相关的代码:
HINSTANCE hModule;
hModule = LoadLibrary("MyLibrary.dll");
// hModule is checked and definitely valid
if(hModule)
{
FreeLibrary(hModule); // HeapCorruption occurs now, but ONLY for "MyLibrary.dll"
}
我真的不知道出了什么问题。在我看来,我必须改变VS项目设置中的一些东西,但我不知道要改变什么,也不知道为什么。它也可能是库中的一些代码吗?
其他信息:“MyLibrary.dll”项目是使用CMake 2.8创建的,并使用Visual Studio 2010 SP1成功构建(但项目“MyOtherLibrary.dll”也是如此)。
有人可以帮忙吗?
答案 0 :(得分:3)
// HeapCorruption occurs now, but ONLY for "MyLibrary.dll"
评论错误。它应该说
// HeapCorruption is detected now.
这是一种非常常见的情况,当代码终止时,它可能会有一些已经使用了一段时间的内存。提供充足的机会让代码中的指针错误和缓冲区溢出损坏内存。或者当EXE和DLL使用不同的CRT版本时从调试堆获取诊断信息。这种堆损坏未被发现,直到堆管理器需要访问该内存才能释放它。 Kaboom然后。
使用<crtdbg.h>
提供的调试分配器来更早地发现这种腐败。通常可用的许多调试工具可以解决堆损坏错误。
答案 1 :(得分:0)
经过相当长的搜索(对于非MVP而言,这真的很痛苦),结果证明它与运行时库有关,就像你们中的一些人已经猜到并回答的那样。
但问题实际上不是我链接到(libcmt.lib)的运行时库本身,而是我在项目中设置为忽略的运行时库(它不是libcmtd.lib)。
根据microsoft的这一页,您必须仔细关注哪个库可以忽略,具体取决于您使用的库。现在我想知道为什么没有链接器警告发生..但这是一个不同的主题。
无论如何,非常感谢你的帮助!