我正在尝试使用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;
}
这个结果: error 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内存泄漏检测器中的构建吗?请帮帮忙
发布于 2013-12-30 13:20:08
创建文件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
。这一行应放在所有#include
文件中的所有.cpp行之后。CrtSetDbgFlag
在调试版本中启用内存泄漏分配--当程序退出时,所有未释放的分配都会打印出来。因为new
运算符是重新定义的,所以它们是用源行信息打印的。
对于MFC项目,只需添加行。
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
到每个.cpp文件。所有其他事情都已经由MFC完成了。MFC项目由MFC应用程序向导创建,默认情况下已包含所有必需的内容。例如,使用向导创建具有MFC支持的Win32控制台应用程序-内存泄漏跟踪工作。您只需要将new DEBUG_NEW
重新定义添加到每个添加到项目中的新文件。
https://stackoverflow.com/questions/20839965
复制相似问题