0

我正在尝试使用 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 内存泄漏检测器吗?请帮忙

4

1 回答 1

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行将默认值重新定义newDEBUG_NEW,仅在 Debug 构建中。此行应放在#include所有 .cpp 文件中的所有行之后。CrtSetDbgFlag在调试构建中启用内存泄漏分配 - 当程序退出时,将打印所有未释放的分配。由于new重新定义了操作符,它们将打印有源代码行信息。

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

#ifdef _DEBUG
#define new DEBUG_NEW
#endif    

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

于 2013-12-30T13:20:08.337 回答