C++ 内存泄漏检测方法

今天分享一下内存泄漏在不同平台的检测方法。

linux/maxos 系统:

使用 valgrind 工具(可在linux、macos系统,以及windows中使用wsl系统下的linux环境使用,不能直接在windows中使用)

安装方法:

CentOS 系统:

yum install -y valgrind

Ubuntu 系统:

apt update
apt install -y valgrind

使用方法

使用要求:编译程序时使用调试信息选项 -g(方便检测泄露的代码行数),例如:

g++ -g test.cpp -o test.exe

使用 valgrind 运行程序:

valgrind --leak-check=full ./your_program
参数描述
–leak-check=full启用详细的内存泄漏检测
–track-origins=yes在内存未初始化时,报告其来源
–log-file=filename将 valgrind 的输出写入文件 filename

linux 运行示例

windows 系统:

下载安装VLD(Visual Leak Detector),最高支持到VS2015版本(实测只要附加包含VLD的头文件目录,以及附加依赖库文件目录,在更高的VS版本也可用),可在Qt中使用。注意:VLD 无法在 minGW 下使用,只能使用 MSVC 编译器。

安装方法:

下载链接:https://github.com/KindDragon/vld/releases/download/v2.5.1/vld-2.5.1-setup.exe
使用安装包安装,安装过程中默认把VLD的头文件和库的目录添加到VC项目中

VLD 安装教程

使用方法

新建一个 C++ 控制台程序:
因为版本问题,如果使用windows 2000或者以前的版本,需要将dbghelp.dll拷贝到你的程序的运行目录下,或其他可以引用到的目录。
接下来需要将其加入到自己的代码中。方法很简单,只要在包含入口函数的.cpp文件中包含vld.h就可以。如果这个cpp文件包含了stdafx.h,则将包含vld.h的语句放在stdafx.h的包含语句之后,否则放在最前面。

#include <vld.h>

int main()
{
    int *a = new int[10];

    return 0;
}

至关重要的一步,在Release模式下,设置<生成调试信息>选项: 生成经过优化以共享和发布的调试信息(/DEBUG:FULL),只有这一项才能输出泄漏的代码文件和行号,即便选择 "生成调试信息(/DEBUG)"也不行。

VLD 配置

在 Debug 模式下运行程序,VLD 会输出内存泄漏报告,其中包含了完整的调用堆栈:

内存泄漏检测示例

看到了吧,提示第 5 行出现了内存泄漏。
还等什么,抓紧时间解决啦:

#include <vld.h>

int main()
{
    int *a = new int[10];

    delete[]a;

    return 0;
}

再次运行程序,内存泄漏已经不见了:

无内存泄漏示例

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值