1

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

有人可以帮忙吗?

4

2 回答 2

3
 // HeapCorruption occurs now, but ONLY for "MyLibrary.dll"

评论是错误的。应该说

 // HeapCorruption is detected now.

这是一个非常常见的场景,当代码终止时,很可能有一些内存要释放,这些内存已经使用了一段时间。提供充足的机会让代码中的指针错误和缓冲区溢出损坏内存。或者,当 EXE 和 DLL 使用不同的 CRT 版本时,从调试堆中获取诊断信息。这种堆损坏不会被发现,直到堆管理器需要访问该内存以释放它。卡布姆然后。

使用可用的调试分配器<crtdbg.h>来更早地捕获这种损坏。许多调试工具通常可用于解决堆损坏错误。

于 2013-06-07T10:07:18.520 回答
0

经过相当长的搜索(这对于非 MVP 来说真的很痛苦),结果证明它与运行时库相关,就像你们中的一些人已经猜到和回答的那样。

但问题实际上不是我链接到的运行时库本身(libcmt.lib),而是我在项目中设置要忽略的运行时库(它不是 libcmtd.lib)。

根据微软的这个页面,您必须仔细注意要忽略哪个库,具体取决于您使用的是哪个库。现在我想知道为什么没有发生链接器警告..但这是一个不同的话题。

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

于 2013-06-11T08:42:14.857 回答