c++ - 使用 Boost 时的内存泄漏检测

标签 c++ boost memory-leaks stdafx.h crtdbg.h

我想使用 _CRTDBG_MAP_ALLOC 获取内存泄漏信息,尤其是文件和行号,但最后我没有得到它们。我只得到这样的东西:

{130} normal block at 0x00695128, 16 bytes long. Data: <\ E Pi > 5C A5 45 01 02 00 00 00 01 00 00 00 E8 50 69 00

我发现这应该位于所有包含之前:

#define _CRTDBG_MAP_ALLOC
#include <cstdlib>
#include <crtdbg.h>

有些人建议在所有源文件中的所有包含之后添加此内容:

#ifdef _DEBUG
#define DEBUG_NEW new(_NORMAL_BLOCK, __FILE__, __LINE__)
#define new DEBUG_NEW
#endif

但是,在 main.cpp 中,如果我显式添加内存泄漏,它会在输出中与行号一起出现!所以它有效,但并不适用于所有情况......

当我使用 Boost 库时,我怀疑内存泄漏都发生在这些......(shared_ptr?)。但如何知道这些内存泄漏从何而来呢?

最佳答案

通常 _CRTDBG_MAP_ALLOC 不会帮助您使用第 3 方代码。 _CRTDBG_MAP_ALLOC 将正常内存分配函数(即 malloc)重定向到特殊的调试版本,该版本在编译时获取文件和行号(即 _malloc___dbg)。如果第 3 方代码不是使用定义的 _CRTDBG_MAP_ALLOC 构建的,那么您将看不到该信息。此外,这对您使用非 CRT 内存分配函数(即 HeapAlloc、GlobalAlloc、LocalAlloc、VirtualAlloc 等)没有帮助,尽管 boost 几乎肯定会使用 CRT 函数。

如果分配编号一致,您可以使用 _CrtSetBreakAlloc 在分配发生时设置断点,以查看哪些代码正在分配内存。另外,请记住,如果您在程序末尾调用 _CrtDumpMemoryLeaks,则任何全局对象尚未被破坏,它们的内存将显示在输出中。

关于c++ - 使用 Boost 时的内存泄漏检测,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1482575/

相关文章:

c++ - 当写在不同的索引上时,这个矩阵类线程安全吗?

c++ - 是否有相当于 fstream 的 boost 功能会导致无法打开文件?

c++ - 捕获微不足道的 boost 异常的奇怪问题

java - 安全线程利用

java - 在已经崩溃的系统上进行堆转储

c++ - QNetworkAccessManager 不发出信号

c++ - 依赖网络时的 Qt 测试

python - 多次将 numpy.argpartition() 分配给列表元素时出现内存泄漏

c++ - 动态删除 QLabel

c++ - 从 Fortran 调用 C 函数,其中 C 函数名称最初是从 C 传入的