在多个动态链接库的解决方案中,基本上每次仅使用一个库“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”也是如此)。
有人可以帮忙吗?
最佳答案
// HeapCorruption occurs now, but ONLY for "MyLibrary.dll"
评论是错误的。应该说
// HeapCorruption is detected now.
这是一个非常常见的情况,当代码终止时,可能会释放一些已经使用了一段时间的内存。提供足够的机会使内存因指针错误和代码中的缓冲区溢出而损坏。或当EXE和DLL使用不同的CRT版本时,从调试堆中获取诊断信息。直到堆管理器需要访问该内存以释放它时,这种堆损坏才被发现。然后,Kaboom。
使用
<crtdbg.h>
中可用的调试分配器可以更早地捕获这种损坏。通常,有许多调试工具可用来解决堆损坏错误。关于c++ - FreeLibrary之后堆损坏了吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16979484/