控制台应用程序的详细内存泄漏转储






4.79/5 (16投票s)
2002年5月22日
1分钟阅读

210967
如何在控制台应用程序中获取内存泄漏的路径和行号信息
引言
在非 MFC 应用程序中查找内存泄漏可能很困难,因为调试器不在调试窗口中显示路径和行号信息。但是,启用这些信息非常容易。方法如下:
步骤 1
将以下代码复制到名为 LeakWatcher.h 的文件中
#ifndef IMWATCHINGYOULEAK #define IMWATCHINGYOULEAK #include <crtdbg.h> #ifdef _DEBUG void* operator new(size_t nSize, const char * lpszFileName, int nLine) { return ::operator new(nSize, 1, lpszFileName, nLine); } #define DEBUG_NEW new(THIS_FILE, __LINE__) #define MALLOC_DBG(x) _malloc_dbg(x, 1, THIS_FILE, __LINE__); #define malloc(x) MALLOC_DBG(x) #endif // _DEBUG #endif // #include guard
第二步
在程序的末尾(或您希望查看未释放内存分配的位置)调用 _CrtDumpMemoryLeaks();
。
步骤 3...N
将以下代码添加到每个源文件中(在最后一个 #include
之后)
#include "LeakWatcher.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif
它做什么?
这与 MFC 应用程序所做的事情相同 - 它将每个分配的路径和行号提供给 C 运行时分配例程。这些例程为每个分配存储路径和行号,并在调用 _CrtDumpMemoryLeaks();
时将其输出。您应该会认出步骤 3 中的那段代码,它来自 AppWizard(以及 ClassWizard,主要是)创建过的每个源文件。
为什么不直接使用 _CRTDBG_MAP_ALLOC?
#define _CRTDBG_MAP_ALLOC
将为由 malloc
引起的泄漏提供文件/行号信息,但对于使用 new
引起的泄漏,它最终会告诉您泄漏发生在 crtdbg.h 中(因为 MS 在那里定义了他们的 new
) - 这并不是很有用。
致谢
这代表了在 Microsoft 的 C 运行时和 MFC 源文件中搜索大约十分钟的时间。因此,所有的功劳都归功于 MS。但是,所有的责任也归咎于 MS,因为他们没有将这部分内容放在非 MFC 头文件中。无论如何,玩得开心,互相友善。