我正在尝试调试一个非常古老的大型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()
{ ....
}
}
在调试模式下,程序成功运行。但是,在输出中我看到上面的错误消息。 在输出中没有位置我能够找到行号,它会告诉我有关检测到内存泄漏的信息。
我需要添加什么额外的内容来查看行号吗?
谢谢
答案 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
。
您也可以重新定义运算符new
和delete
。这是一篇很好的文章,关于如何在旧程序中检测泄漏:link
编辑:此处有人提供另一种使用宏DBG_NEW
调试现有程序的方法,link