Table of Contents:

Valgrind

Valgrind 是个开源的工具,功能很多,但只能在linux下使用。例如检查内存泄漏工具---memcheck。
用法: valgrind [options] prog-and-args
[options]: 常用选项,适用于所有Valgrind工具
-tool=<name> 最常用的选项。运行 valgrind中名为toolname的工具。默认memcheck。

检查内存泄漏

valgrind --tool=memcheck --leak-check=full ./test

例如:

#include <iostream>
using namespace std;
int main()
{
        for(int i = 0; i < 1000000; i++)
        {
                new int(2);
        }
    return 0;
}
valgrind --tool=memcheck --leak-check=full ./a.out

运行后会进行进行相应的报告输出:
image.png

Visual Leak Detector

Visual Leak Detector(VLD)是为C++编程环境设计的内存泄漏检测工具,它通过监控程序运行时的内存分配和释放行为来帮助开发者发现内存泄漏问题。VLD在程序结束时检查未释放的内存块,生成报告揭示泄漏源头,从而让开发者能针对性地修复问题,提升软件的稳定性和资源利用效率。

VLD的使用

1.下载并安装VLD,安装后如下:
image.png

2.在自己的c++程序中引入include path 并链接vld的库
3.无需修改程序中的代码,程序运行是会自动打印相关的内存报告

VLD的工作机制

在Windows操作系统中,C/C++编程语言通常使用动态内存分配函数如 malloc 、 calloc 、 realloc 和 free 进行内存的分配与释放。

VLD正是通过挂钩到这些函数来检测内存分配和释放是否匹配。挂钩机制(Hooking)是一种广泛应用于软件开发中,用于修改或增强操作系统或软件系统功能的技术。VLD利用这一技术,将自己“插入”到标准的内存管理函数中,使得每当程序进行内存分配或释放操作时,VLD都能够记录相关信息,实现对内存使用情况的监控。

VLD在跟踪内存分配时,记录了每次内存分配请求的详细信息,如分配的地址、大小和调用堆栈。
这些信息会被保存在内存泄漏检测器内部的一个数据结构中。

以下是VLD实现内存分配跟踪的基本原理:
- 初始化 :VLD在程序启动时初始化其内部数据结构,为捕获内存分配请求做准备。
- 挂钩内存管理函数 :VLD挂钩到内存管理函数,使得每当这些函数被调用时,相应的VLD函数也会被触发。
- 记录分配信息 :当 malloc 、 calloc 等函数被调用时,VLD记录内存分配的详细信息,如调用源代码的位置和分配的字节数。
- 跟踪内存释放 :每当 free 函数被调用来释放内存时,VLD检查之前记录的分配信息,并清除对应的条目
- 分析内存泄漏 :如果程序结束时,VLD发现内存分配记录中还有未被释放的条目,则这些未释放的内存被视为泄漏。