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

Detect memory leak by overload new operator?

本文关键字:检测 内存 泄漏 运算符 重载      更新时间:2023-10-16

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

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,因为我在编译程序时出错:

Error   166 error LNK2005: "void * __cdecl operator new(unsigned __int64,char *,unsigned int)" (??2@YAPEAX_KPEADI@Z) already defined in CommonGlobal.obj    E:TIN HOCLearningChuong Tring Dao TaoWorkingMain_CodeMysticbranchesDVRServerCommonMessage.obj Common

有人可以告诉我如何重载运算符 new,以便在其中进行调试?

链接器抱怨运算符 new 的重新定义。您可能在包含在多个文件(至少在 CommonGlobal 和 Message.cpp 中(的头文件中定义了该函数.cpp。将其移动到源文件或向其添加inline说明符。如果在源文件中定义运算符 new is,请确保它仅在一个源文件中 - 它适用于所有源文件中对运算符 new 的所有调用。

if(size = 1107)也很可疑 - 它总是会中断并始终分配大小为 1107 的内存。如果要在大小等于 1107 时中断,请将其更改为 if(size == 1107)。在 Windows 下,您还可以调用中断调试器的__debugbreak(),而无需手动放置断点,但您不能期望它在与 Visual C++ 不同的编译器下工作。

对于视觉检漏仪:您是否在VS的输出窗口和控制台中看到类似Visual Leak Detector Version 2.4RC2 installed消息的消息?如果没有,请在包含 vld.h 之前将活动配置从发布切换到调试或#define VLD_FORCE_ENABLE

请包括新的

#include <new>

以及,Karoly 如何提到,将行 if(size = 1107( 更改为

if(size == 1107)

然后程序工作。