我试图找出我们的产品存在的内存泄漏问题。我们正在使用带有 CERN 根 5.28/00b 的 VS2008 非托管 C++。我将以下内容添加到包含在所有文件中的标题中:
#ifndef __CINT__
#define _CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>
#endif // __CINT__
我还在 main.cpp 中添加了以下内容,其中包括所有文件中包含的标头:
int prevState = _CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
这会导致 _CrtDumpMemoryLeaks() 在退出时正确执行。当应用程序中的特定进程完成时,我还开始显式调用 _CrtDumpMemoryLeaks(),因为这是我怀疑内存泄漏的地方。我得到了“内存泄漏”的转储,但它没有文件路径和行号信息,这些信息会使转储对我更有价值。许多转储条目似乎被认为是泄漏,因为应用程序调用 exit(0) 而没有首先调用关联的析构函数。无法确定实际泄漏的数量。使用文件名和行号信息,我将能够更准确地判断是否存在泄漏,或者只是应用程序在退出时没有破坏它的原因。
在你评论这些没有被销毁之前,代码还有很多清理工作要做,但我们试图首先解决更直接的问题。
我的问题是,当我将以下几行添加到我的代码中时,我认为这是一个建议的修复,我无法构建:
#ifdef _DEBUG
#define DEBUG_NEW new(_NORMAL_BLOCK, __FILE__, __LINE__)
#define new DEBUG_NEW
#endif
我收到构建错误:
error C2661: 'TObject::operator new' : no overloaded function takes 4 arguments
似乎 Root 和 CRTDBG 定义的 new 重载之间存在冲突。如果有人有智慧的话可以帮助我解决这个冲突,以便我可以开始获取文件路径和行号信息,我将非常感激。谢谢你的帮助。