检测到内存泄漏
Detected Memory Leak
我正在尝试调试一个非常旧的大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
.
您也可以重新定义运算符new
和delete
。这是一篇关于如何检测旧程序中的泄漏的优秀文章:链接
编辑:这里有人提供了另一种使用宏DBG_NEW
调试现有程序的方法,链接
相关文章:
- C++功能泄漏内存,我是C++新手,不确定如何解决
- 我的堆栈弹出式磁带的实现是否泄漏内存?
- 将 c++ 向量转换为字符 ** 而不会泄漏内存
- 析构函数 C++ 使泄漏内存
- 构造函数对象赋值是否泄漏内存
- corba :: orb_init泄漏内存
- Gmock泄漏内存
- 如何在不泄漏内存的情况下删除链接列表
- Visual C ODBC关闭记录集泄漏内存
- 为什么泄漏内存比在动态数组上执行 delete[] 慢
- OpenGL正在泄漏内存.哪个对象未释放
- 可以std ::退出泄漏内存
- uiautomation findall泄漏内存
- 为什么在此OpenCL代码中泄漏内存,为什么要泄漏内存
- pthread在完成后会泄漏内存
- win32 标准::线程泄漏内存
- 返回指向同一变量的指针是否会泄漏内存
- 使用clectType(new any_type())可能会泄漏内存泄漏
- Windows开发:如何确定我的应用程序是否正在泄漏内存
- WinHttp打开泄漏内存