0

我有一个主机程序隐式(使用库及其 DLL)加载 DLL。当我故意进行内存泄漏时,在我的主机程序中,CrtDbg*函数会检测到泄漏。当我故意在其中一个 DLL 中发生内存泄漏时,不会检测到泄漏。

注意:在我的主机中,我_CrtDumpMemoryLeaks在主功能终止后激活该功能。

4

1 回答 1

4

您的 DLL 很可能静态链接到 CRT。(或者它们是零售版本,但您的 EXE 是调试版本)。不管怎样,你有不止一个堆。当您调用 _CrtDeumpMemoryLeaks 时,它只能跟踪发出调用的二进制文件的未释放内存分配。你有两个选择。

  • 更改所有代码(DLL 和 EXE)以链接到相同的 MSVCRT DLL,而不是静态链接。在每个二进制文件的项目设置中,选择“多线程调试 DLL”或“多线程 DLL”作为 CRT 的链接类型。不要选择静态的。然后所有 DLL 和 EXE 将共享同一个堆。

或者

  • 从每个 DLL 中导出一个名为“DetectMemoryLeaks”的函数(或其他 DLL 的类似命名函数,因此不存在命名冲突)。这个函数只调用_CrtDumpMemoryLeaks。在您的 EXE 中,在您调用 _CrtDumpMemoryLeaks 的同时调用此函数。每个 DLL 中的每个堆都将被检查是否存在泄漏。
于 2013-01-13T09:18:08.010 回答