我正在尝试使用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内存泄漏检测器中使用构建吗? 请帮忙
答案 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
重新定义。