我正在尝试debugging一个非常古老的大型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() { .... } }
在debugging模式下,程序运行成功。 但是,在输出中我看到上面的错误信息。 没有在输出的地方,我能find的行号,可以告诉我在哪里检测到内存泄漏。
有什么额外的我需要添加查看行号?
谢谢
在_CrtSetDbgFlag之后添加此行
_CrtSetBreakAlloc(629);
629是你在转储日志中看到的,通常意味着内存的分配。 再次运行调试,你将停止在那个分配,然后你可以检查调用堆栈看看是什么。
根据微软文档得到一个更好的报告,显示文件的名称和泄漏的内存第一次分配的行号,你首先必须包括_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
。
你也可以重新定义操作符new
和delete
。 这里有一篇关于如何检测旧程序泄漏的优秀文章: 链接
编辑:这里有人给出了另一种使用宏DBG_NEW
调试现有程序, 链接的方式