无法使用 VS2008 内存泄漏检测器
Posted
技术标签:
【中文标题】无法使用 VS2008 内存泄漏检测器【英文标题】:Cannot use VS2008 memory leak detector 【发布时间】:2013-12-30 12:52:10 【问题描述】:我正在尝试使用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 内存泄漏检测器吗? 请帮忙
【问题讨论】:
【参考方案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
行将默认 new
重新定义为 DEBUG_NEW
,仅在调试版本中。此行应放在所有 .cpp 文件中的所有 #include
行之后。 CrtSetDbgFlag
在调试版本中启用内存泄漏分配 - 当程序退出时,将打印所有未释放的分配。由于new
运算符被重新定义,因此它们会打印出源代码行信息。
对于MFC项目,只需要添加行
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
到每个 .cpp 文件。所有其他事情都已经由 MFC 完成。由 MFC 应用程序向导创建的 MFC 项目已默认包含所有必需的东西。例如,使用向导创建支持 MFC 的 Win32 控制台应用程序 - 内存泄漏跟踪正在工作。您只需将new DEBUG_NEW
重新定义添加到项目中添加的每个新文件即可。
【讨论】:
问题是使用 CObject(这需要 afx.h)所以你的建议对我没有帮助。交易 答案已编辑。使用 MFC 应用程序向导创建新项目并将DRV *d = new DRV;
行添加到其中 - 编译成功,并检测到泄漏。
感谢 Alex,但它仍然无法编译。
使用向导创建 MFC 项目总是更好。它适用于 VS2010,我无法用 VS2008 进行测试,但它必须适用于每个 VS 版本。
你是对的。它适用于新创建的 MFC 应用程序。我的问题是我有一个巨大的项目,无法编译。所以我将不得不更深入地挖掘。谢谢!以上是关于无法使用 VS2008 内存泄漏检测器的主要内容,如果未能解决你的问题,请参考以下文章
Visual Leak Detector在 VS 2015 中使用 VLD