c++ - 如何找到内存泄漏的位置?

标签 c++ visual-c++ memory-leaks

我已将以下内容添加到我的 main 的末尾,我得到了内存泄漏报告,但没有创建断点来显示当我在 Debug模式下运行代码时发生泄漏的位置。我正在使用 VS C++ 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 项目,创建文件 DebugNew.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:\projects\test\main.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.

关于c++ - 如何找到内存泄漏的位置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24593123/

相关文章:

c++ - C++ 中字符数组与整数数组的指针

c++ - opencv::flann:Index knnsearch 线程安全吗?

c++ - 如何在 vc++ 中使用samplegrabber?样本采集器未定义

c++ - OpenCV逐帧视频拼接

c - 在 C 中的循环内分配和释放内存

c++ - 在元组中搜索函数的参数

c++ - 使用 Poco C++ 库,如何将数据传递给线程?

visual-c++ - 如何在 Visual Studio 2017 中使用 CMake 设置编译器选项

c++ - 两次释放内存

C 内存泄漏,在 while 循环中连接