首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >不能使用VS2008内存泄漏检测器

不能使用VS2008内存泄漏检测器
EN

Stack Overflow用户
提问于 2013-12-30 12:52:10
回答 1查看 778关注 0票数 0

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

最简单的方案运行良好,但当我尝试使用CObject时它不会编译。

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

代码语言:javascript
运行
复制
#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中的“常量”:

代码语言:javascript
运行
复制
void* PASCAL operator new(size_t nSize);

如果我试图将#ifdef _DEBUG移到#include "afx.h“下面,我得到:

代码语言:javascript
运行
复制
error C2661: 'CObject::operator new' : no overloaded function takes 4 arguments

在线:

代码语言:javascript
运行
复制
DRV *d = new DRV;

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-12-30 13:20:08

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

代码语言:javascript
运行
复制
#pragma once

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

在cpp文件中:

代码语言:javascript
运行
复制
#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项目,只需添加行。

代码语言:javascript
运行
复制
#ifdef _DEBUG
#define new DEBUG_NEW
#endif    

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20839965

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档