内存泄漏

检查内存泄漏

Linux 下使用 Valgrind;Windows 下使用 Visual Leak Detector。前者没接触过,后者的确不错。

虽然在 Windows 下可以使用 CRT:Find memory leaks with the CRT library,但因为其也会报全局变量以及 static 变量(报告早于这两者的析构),当项目体量较大,全局变量或 static 变量较多时,没有有效的区分,查找真实的内存泄漏就会比较棘手。

  1. Enable memory leak detection,如何启用

    只在启用 _DEBUG 时有效;若程序存在多个退出点,可以使用 _CrtSetDbgFlag 函数;报告默认在“输出”窗口打印,但可以自定义。

  2. Interpret the memory-leak report,报告怎么看

    重点强调了检测只针对 malloc 函数,无法检测 new 操作符。但其提供了使用 _malloc_dbg 实现的 operator new 重载版本:

  3. Set breakpoints on a memory allocation number,如何打断点

  4. Compare memory states,对比不同时刻的快照

  5. False positives,误报现象

虽然文章中特别提到:

We don’t recommend you create a preprocessor macro named new, or any other language keyword.

但是在好多中文博客中都是通过直接定义 new 的同名宏来避免对代码主体的修改(文件头和 main 的修改无可避免):比如 vczh

在网络上找到一篇 关于全局变量内存泄漏的误报和解决方案,但并未验证。

crt

待补充

vld

Using Visual Leak Detector,其使用是非常简单的。建议在每个程序中都默认启用。

VS内存泄漏工具Visual Leak Detector2.5.1安装与使用

linux 平台内存泄漏

Linux下几款C++程序中的内存泄露检查工具