我在程序中发现内存泄漏,我尝试了以下微软指南
http://msdn.microsoft.com/en-us/library/e5ewb1h3%28v=vs.90%29.aspx
但是有一些内存泄漏报告项,没有源文件名和代码行。
我尝试使用VLD,但是VLD没有在调用堆栈上显示文件名,尽管我在互联网上的指南中做了任何步骤。
从VLD的内存泄漏报告中,我可以看到块泄漏的大小。所以我有这个主意。假设我可以重载操作符new,并对其进行调试,也许我可以通过特殊断点检测内存泄漏的位置,如下面的代码所示。
void* operator new (size_t size)
{
if(size = 1107)
{
int temp = 0; //Put the break point here
}
void *p = malloc(size);
return p;
}
但我不能重载new new,因为编译程序时出错:
Error 166 error LNK2005: "void * __cdecl operator new(unsigned __int64,char *,unsigned int)" (??2@YAPEAX_KPEADI@Z) already defined in CommonGlobal.obj E:\TIN HOC\Learning\Chuong Tring Dao Tao\Working\Main_Code\Mystic\branches\DVRServer\Common\Message.obj Common
有人可以告诉我如何重载new new,进行调试吗?
答案 0 :(得分:1)
链接器抱怨重新定义operator new。您可能在包含在多个文件中的头文件中定义了该函数(至少在CommonGlobal.cpp和Message.cpp中)。将其移动到源文件或向其添加inline
说明符。如果您在源文件中定义了operator new,请确保它只在一个源文件中 - 它适用于所有源文件中对operator new的所有调用。
同样if(size = 1107)
是可疑的 - 它总是会中断,并且总是会分配一个大小为1107的内存。如果你想在大小等于1107时中断,请将其更改为if(size == 1107)
。在Windows下你也可以调用__debugbreak()
进入调试器而不需要手动设置断点,但是你不能指望它在不同于Visual C ++的编译器下工作。
对于Visual Leak Detector:你在VS的输出窗口和控制台中看到了Visual Leak Detector Version 2.4RC2 installed
消息这样的消息吗?如果没有,请在包含vld.h之前将活动配置从Release更改为Debug或#define VLD_FORCE_ENABLE
。
答案 1 :(得分:0)
请加入新
#include <new>
并且,Karoly如何提及,将行if(size = 1107)更改为
if(size == 1107)
然后该程序工作。