不能使用VS2008内存检漏仪

时间:2013-12-30 12:52:10

标签: memory-leaks memory-leak-detector

我正在尝试使用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中的'constant':

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 个答案:

答案 0 :(得分:0)

创建文件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行仅在Debug版本中将默认new重新定义为DEBUG_NEW。此行应放在所有.cpp文件中的所有#include行之后。 CrtSetDbgFlag在调试版本中启用内存泄漏分配 - 当程序退出时,将打印所有未发布的分配。由于重新定义了new运算符,因此会使用源行信息打印它们。

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

#ifdef _DEBUG
#define new DEBUG_NEW
#endif    

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