发现C++程序中未释放的内存空间

本篇先后介绍在windows中使用visual studio定位未释放的内存、在linux中使用valgrind定位未释放的内存。


Windows+Visual Studio 2015 (企业版)

准备好测试程序后,点击“分析”-“性能探查器”

勾选“内存使用率”,点击“开始”

 程序进入运行状态。点击“拍摄快照”,分析器会将当前的内存使用情况保存到一个快照里。

 根据情况,创建多个快照,以便于查看相邻快照的内存变化情况。点击“停止”,出现如下所示界面。

 红框处的表示相比上一次快照,内存的变化情况。点击该文字,可以进入详细情况查看页,可以看到增加(如果有的话)的字节是在哪被分配的。

 


Linux环境中

需要借助开源工具 valgrind 。经测试,该工具最新版(22 June 2020)在Redhat 6.4环境中可用。若要用得顺畅,可能需要一点英语能力。

该工具的最大优点是非侵入式的,即无需修改原测试程序就可以检测内存占用。但需要编译测试程序时的g++命令带上 -g 选项

下载页面网址:https://www.valgrind.org/downloads/current.html#current 。

懒人地址:https://sourceware.org/pub/valgrind/valgrind-3.16.1.tar.bz2

下载完成后,安装很简单,根据Readme里的指引来就行,有如下三步

  1. ./configure
  2. make
  3. make install

然后可以直接使用valgrind了。使用前检查是否真的安装成功:valgrind --leak-check=full ls -l

使用该工具的常用格式是:valgrind --tool=memcheck --leak-check=full [程序名] [程序运行参数]

可以通过 valgrind --help 查看帮助。

在程序运行过程中,valgrind会将内存使用不当的地方输出;当程序运行完成或中断后,valgrind会将可能有内存未释放的地方列出来。

为了防止valgrind的输出和程序的输出混在一起,可以给valgrind命令添加--log-file选项,将valgrind的输出定向到文件中,这样就可以直接在这个文件中查看日志使用情况了。

如:valgrind --tool=memcheck --leak-check=full --log-file=valgrind.log [程序名] [程序运行参数]

原文地址:https://www.cnblogs.com/winstonet/p/13288316.html