65.9K
CodeProject 正在变化。 阅读更多。
Home

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

2002年5月22日

1分钟阅读

viewsIcon

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 头文件中。无论如何,玩得开心,互相友善。

© . All rights reserved.