无法使用 VS2008 内存泄漏检测器

Posted

技术标签:

【中文标题】无法使用 VS2008 内存泄漏检测器【英文标题】:Cannot use VS2008 memory leak detector 【发布时间】:2013-12-30 12:52:10 【问题描述】:

我正在尝试使用VS2008内存泄漏工具,但我完全没有构建它。

最简单的场景效果很好,但是当我尝试使用 CObject 时 - 它无法编译

这是代码(它是一个新创建的控制台应用程序)

#include "stdafx.h"

#ifdef _DEBUG
#ifndef DBG_NEW
#define DBG_NEW new ( _NORMAL_BLOCK , __FILE__ , __LINE__ )
#define new DBG_NEW
#endif
#endif  // _DEBUG

#define _AFXDLL
#include "afx.h"

class DRV : public CObject ;

int _tmain(int argc, _TCHAR* argv[])

    DRV *d = new DRV;

这会导致:错误 C2059:语法错误:afx.h 中的“常量”:

void* PASCAL operator new(size_t nSize);

如果我尝试将 #ifdef _DEBUG 移动到 #include "afx.h" 下方,我会得到:

error C2661: 'CObject::operator new' : no overloaded function takes 4 arguments

上线:

DRV *d = new DRV;

那么 - 我做错了什么? 我可以使用内置的 VS2008 内存泄漏检测器吗? 请帮忙

【问题讨论】:

【参考方案1】:

创建文件 DebugNew.h 并将此代码添加到其中:

#pragma once

#include "crtdbg.h"
#ifdef _DEBUG
#define DEBUG_NEW   new( _NORMAL_BLOCK, __FILE__, __LINE__)
#else
#define DEBUG_NEW
#endif

在cpp文件中:

#include "stdafx.h"
#include "DebugNew.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif    

int _tmain(int argc, _TCHAR* argv[])

    CrtSetDbgFlag( _CrtSetDbgFlag(_CRTDBG_REPORT_FLAG) | _CRTDBG_LEAK_CHECK_DF);

    char *d = new char[100];

DebugNew.h 文件定义了new 运算符,它允许包含每个分配的源代码行信息。 #define new DEBUG_NEW 行将默认 new 重新定义为 DEBUG_NEW,仅在调试版本中。此行应放在所有 .cpp 文件中的所有 #include 行之后。 CrtSetDbgFlag 在调试版本中启用内存泄漏分配 - 当程序退出时,将打印所有未释放的分配。由于new 运算符被重新定义,因此它们会打印出源代码行信息。

对于MFC项目,只需要添加行

#ifdef _DEBUG
#define new DEBUG_NEW
#endif    

到每个 .cpp 文件。所有其他事情都已经由 MFC 完成。由 MFC 应用程序向导创建的 MFC 项目已默认包含所有必需的东西。例如,使用向导创建支持 MFC 的 Win32 控制台应用程序 - 内存泄漏跟踪正在工作。您只需将new DEBUG_NEW重新定义添加到项目中添加的每个新文件即可。

【讨论】:

问题是使用 CObject(这需要 afx.h)所以你的建议对我没有帮助。交易 答案已编辑。使用 MFC 应用程序向导创建新项目并将DRV *d = new DRV; 行添加到其中 - 编译成功,并检测到泄漏。 感谢 Alex,但它仍然无法编译。 使用向导创建 MFC 项目总是更好。它适用于 VS2010,我无法用 VS2008 进行测试,但它必须适用于每个 VS 版本。 你是对的。它适用于新创建的 MFC 应用程序。我的问题是我有一个巨大的项目,无法编译。所以我将不得不更深入地挖掘。谢谢!

以上是关于无法使用 VS2008 内存泄漏检测器的主要内容,如果未能解决你的问题,请参考以下文章

使用UMDH检测内存泄漏

Visual Leak Detector在 VS 2015 中使用 VLD

Netty源码-内存泄漏检测toLeakAwareBuffer

QT VS检测内存泄漏

如何在linux下检测内存泄漏

VS2005 检测内存泄漏的方法(转载)