检测到内存泄漏

Detected Memory Leak

本文关键字:泄漏 内存 检测      更新时间:2023-10-16

我正在尝试调试一个非常旧的大C++项目。它给出以下错误:

 Detected memory leaks!
 Dumping objects ->
 {629} normal block at 0x0000000000084CA0, 16 bytes long.
 Data: <   ?            > D0 A7 F0 3F 01 00 00 00 00 00 00 00 00 00 00 00 
 {628} normal block at 0x0000000000084C20, 16 bytes long.
 Data: <   ?            > 10 A9 F0 3F 01 00 00 00 00 00 00 00 00 00 00 00
 {5667963} normal block at 0x000000000709FB20, 88 bytes long.
 ....
 ....
 Data: <p       3       > 70 D0 0F 07 00 00 00 00 33 00 00 00 00 01 00 00 
 Object dump complete.
 The program '[4892] Classifier.exe' has exited with code 0 (0x0).

我无法粘贴该程序,因为它很大,但它是这样的

 void main(int argc, char *argv[]) 
 {
     try 
     {
    _CrtDumpMemoryLeaks(); //memory leak detection
    _CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);   
    _CrtSetReportMode(_CRT_ERROR, _CRTDBG_MODE_DEBUG);  
    ....
    ....
     }
     catch()
    {   ....
    }
 }

在调试模式下,程序成功运行。但是,在输出中,我看到上述错误消息。在输出中,我无法找到行号,该行号将为我提供有关检测到内存泄漏的位置的信息。

我需要添加什么额外的内容才能查看行号吗?

谢谢

在 _CrtSetDbgFlag 之后添加此行

 _CrtSetBreakAlloc(629);
629

是您在转储日志中看到的,它通常意味着 629 的内存分配。 再次运行调试,您将在该分配处停止,然后您可以检查调用堆栈以查看那是什么。

根据 Microsoft 文档,要获得更好的报告,显示文件名和首次分配泄漏内存的行号,您首先必须包括_CRTDBG_MAP_ALLOC

#define _CRTDBG_MAP_ALLOC
#include <cstdlib>
#include <crtdbg.h>

如果程序使用 new 而不是 malloc 进行分配,则必须定义此宏:

#ifdef _DEBUG
    #define DBG_NEW new ( _NORMAL_BLOCK , __FILE__ , __LINE__ )
#else
    #define DBG_NEW new
#endif

在您的情况下,调试旧程序(如果它有相当数量的文件)不是很有用。但是有一个技巧是可以做到的,

#define new new ( _NORMAL_BLOCK , __FILE__ , __LINE__ )

但是这个技巧有一些缺点。例如,如果类覆盖new,或者程序使用 placement new .

您也可以重新定义运算符newdelete。这是一篇关于如何检测旧程序中的泄漏的优秀文章:链接

编辑:这里有人提供了另一种使用宏DBG_NEW调试现有程序的方法,链接