gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 11:24:21 25 4
gpt4 key购买 nike

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

http://msdn.microsoft.com/en-us/library/e5ewb1h3%28v=vs.90%29.aspx

但是有一些内存泄漏报告项,没有源文件名和代码行。

我尝试使用 VLD,但 VLD 不在调用堆栈上显示文件名,尽管我在 Internet 上的指南中执行了任何步骤。

从VLD的内存泄漏报告中可以看出泄漏的 block 大小。所以我有这个想法。假设我可以重载 operator new 并对其进行调试,也许我可以像下面的代码那样通过特殊断点检测到哪里发生了内存泄漏。

void* operator new (size_t size)
{
if(size = 1107)
{
int temp = 0; //Put the break point here
}
void *p = malloc(size);
return p;
}

但是我不能重载operator 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

谁能告诉我如何重载 operator new,以便在其中进行调试?

最佳答案

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

if(size = 1107) 也很可疑 - 它总是会中断并始终分配大小为 1107 的内存。将其更改为 if(size == 1107) 如果你想在 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

关于c++ - 通过重载新运算符检测内存泄漏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27205425/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com