FreeLibrary之后的堆腐败?

时间:2013-06-07 08:26:25

标签: c++ visual-studio-2010 winapi dll heap-corruption

在多个动态链接库的解决方案中,每次基本上只有一个单独的库“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”也是如此)。

有人可以帮忙吗?

2 个答案:

答案 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的这一页,您必须仔细关注哪个库可以忽略,具体取决于您使用的库。现在我想知道为什么没有链接器警告发生..但这是一个不同的主题。

无论如何,非常感谢你的帮助!