无法检测静态附加到C ++程序的DLL中的内存泄漏

时间:2013-01-13 08:51:11

标签: c++ memory dll memory-leaks detect

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

注意:在我的主机中,我在主函数终止后激活_CrtDumpMemoryLeaks函数。

1 个答案:

答案 0 :(得分:3)

您的DLL很可能静态链接到CRT。 (或者它们是零售版本,但您的EXE是调试版本)。无论哪种方式,您都有多个堆。当您调用_CrtDeumpMemoryLeaks时,它只能跟踪调用的二进制文件的未释放内存分配。你有两个选择。

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

  • 从每个DLL中导出一个名为“DetectMemoryLeaks”的函数(或其他DLL的类似命名函数,因此没有命名冲突)。此函数只调用_CrtDumpMemoryLeaks。在您的EXE中,在调用_CrtDumpMemoryLeaks的同时调用此函数。将检查每个DLL中的每个堆是否存在泄漏。