如何找到内存泄漏的位置
How to find where the memory leak is?
我已经将以下内容添加到main的末尾,并且我得到了内存泄漏报告,但是当我在调试模式下运行时,没有创建断点显示泄漏在代码中发生的位置。我使用vsc++ 2010 express。是我做错了什么,还是我添加的代码有问题。如果有帮助的话,我可以发布更多的代码。
#ifdef _WIN32
if (_CrtDumpMemoryLeaks()) {
cout << "Memory leaks!" << endl;
}
#endif
#ifdef _DEBUG
int flag = _CrtSetDbgFlag(_CRTDBG_REPORT_FLAG);
flag |= _CRTDBG_LEAK_CHECK_DF; // Turn on leak-checking bit
_CrtSetDbgFlag(flag);
_CrtSetBreakAlloc(427);
#endif
int flag = _CrtSetDbgFlag(_CRTDBG_REPORT_FLAG);
flag |= _CRTDBG_LEAK_CHECK_DF;
_CrtSetDbgFlag(flag);
这足以启用内存泄漏检测。不要直接调用_CrtSetDbgFlag
。但是,为了获得调用了泄漏分配的源代码行,您需要做更多的工作。
将这些行添加到每个.cpp文件的开头,紧跟在所有#include行之后:
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
对于MFC项目,这就足够了,MFC头包含DEBUG_NEW
。对于非mfc项目,创建文件debugnews .h:
#pragma once
#include "crtdbg.h"
#ifdef _DEBUG
#define DEBUG_NEW new( _NORMAL_BLOCK, __FILE__, __LINE__)
#else
#define DEBUG_NEW
#endif
将其包含到每个.cpp文件中。内存泄漏报告现在应该是这样的:
Detected memory leaks!
Dumping objects ->
c:projectstestmain.cpp(20) : {181} normal block at 0x005A80F8, 100 bytes long.
Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
Object dump complete.
http://msdn.microsoft.com/en-us/library/4wth1ha5.aspx
首先,我认为你在这里发布的这组代码需要放在主函数体的第一行,但我不确定。
据我所知,_CrtSetBreakAlloc函数会让调试器在应用程序试图分配作为参数传递的位置时中断。
当调试器将内存泄漏转储到输出窗口时,您是否获得内存的位置?您必须复制该位置,并在下次运行时将其用作_CrtSetBreakAlloc调用的参数。(例如下面输出的276)
Dumping objects ->
{276} normal block at 0x007AC200, 4 bytes long.
Data: < > CD CD CD CD
Object dump complete.
那么函数调用将是_CrtSetBreakAlloc(276);
我个人建议您使用视觉泄漏检测器,它将为您提供有关消息中泄漏发生位置的更多线索。
相关文章:
- valgrind-hellgrind与泄漏检查的结果不同
- 将值指定给向量(2D)的向量中的某个位置
- 使用Unreal C++获取VR耳机的世界位置/方向
- 写入位置0x0000000C时发生访问冲突
- 如何将两个不同矢量的同一位置的两个元素组合在一起
- 从构造函数抛出异常时如何克服内存泄漏
- GL_SHADERSTORAGE_BUFFER位置是否与其他着色器位置冲突
- malloc() 可能出现内存泄漏
- 如何使用cudaMallocManaged在指针位置初始化对象?(C++)
- 这个极客对极客的trie实现是否存在内存泄漏问题
- 无法获取webot::PositionSensor对象中位置传感器的值
- 非常量变量只读位置的赋值
- 如何定义更改car类中car位置的方法
- 使用迭代器时如何访问对象在向量中的位置?
- 更改.cpp程序的输入文件中数据的位置会意外更改输出
- 求最大元素位置的分治算法
- 如何识别内存泄漏的位置
- 如何检测导致内存泄漏C++的线路的真实位置
- 在VS C++ 6.0中,哪些调试工具适合查找内存泄漏的位置
- 如何找到内存泄漏的位置