通过重载新运算符检测内存泄漏
Detect memory leak by overload new operator?
我发现我的程序中存在内存泄漏,我尝试了以下指南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)
然后程序工作。
- 如何检测内存分配/空闲错误的对象?
- 编译器如何检测内存损坏
- 地址清理器无法使用选项 -O 检测内存泄漏
- 为引用计数的智能指针检测内存泄漏的设计模式
- 在 Windows 上的分配开始失败之前检测内存不足
- 如何在tbbmalloc中检测内存泄漏
- 检测"内存泄漏"时,瓦尔格林德的真实指针是什么?
- 使用 Valgrind 检测内存泄漏的抑制"dl-hack3-cond-1"
- 通过重载新运算符检测内存泄漏
- Visual Studio 2008,检测内存泄漏,符号"__FILE__"未定义
- 如何从被调用方的角度检测内存是动态的还是静态的
- 使用谷歌测试框架(不是窗口)检测内存泄漏的标准做法是什么?
- 如何在使用JNI的C++/Java项目中使用CRT中的工具检测内存泄漏
- 如何以可移植的方式在C++中自动检测内存泄漏
- 用于检测内存泄漏的应用程序
- 在对象的d-tor期间检测内存泄漏
- 如何检测内存泄漏在我的Qt软件的Valgrind或其他工具
- 获取在堆上分配的块数量,以检测内存泄漏
- CppCheck不检测内存泄漏
- Valgrind检测内存泄漏