【问题标题】:Cannot use VS2008 memory leak detector无法使用 VS2008 内存泄漏检测器
【发布时间】: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 内存泄漏检测器吗? 请帮忙

【问题讨论】:

    标签: memory-leaks memory-leak-detector


    【解决方案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 应用程序。我的问题是我有一个巨大的项目,无法编译。所以我将不得不更深入地挖掘。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-16
    • 2019-09-09
    • 1970-01-01
    • 2011-12-13
    • 1970-01-01
    相关资源
    最近更新 更多