检测到内存泄漏

时间:2017-01-10 23:08:19

标签: c++ windows memory-leaks

我正在尝试调试一个非常古老的大型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()
    {   ....
    }
 }

在调试模式下,程序成功运行。但是,在输出中我看到上面的错误消息。 在输出中没有位置我能够找到行号,它会告诉我有关检测到内存泄漏的信息。

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

谢谢

2 个答案:

答案 0 :(得分:5)

在_CrtSetDbgFlag

之后添加此行
 _CrtSetBreakAlloc(629);

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

答案 1 :(得分:0)

根据microsoft documentation获取更好的报告,显示文件名和首次分配泄漏内存的行号,首先必须包含_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。这是一篇很好的文章,关于如何在旧程序中检测泄漏:link

编辑:此处有人提供另一种使用宏DBG_NEW调试现有程序的方法,link