通过重载新运算符检测内存泄漏?

时间:2014-11-29 18:17:33

标签: c++ memory-leaks new-operator

我在程序中发现内存泄漏,我尝试了以下微软指南

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,进行调试吗?

2 个答案:

答案 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)

然后该程序工作。