前言:c++及c这种底层的编程语言,在获得更多程序控制自由度的同时,也承担了更多内存泄露的风险,有些同学想说,内存泄露只要看下c++的应用程序在运行时内存有没有一直增加不就行了吗,windows和linux系统都有现场的工具可以查看,但如果有些内存泄露了,只在程序结束时才被释放出来,从内存的占用量根本看不出来。
valgrind工具是一款在linux系统中运行的可以直接对应用程序进行内存泄露检测的工具,该工具可以直接定位到cpp文件的函数模块,可以说非常细致了,定义到函数模块在检查内存泄露可以说基本没什么问题了。在c++代码中常见的代码泄露问题大致有以下几种:
- memset内存块没有释放掉,这种情况其实看系统的占用量就能看出来,一般出现这种情况,内存占用量会一直上升,直到系统崩掉。
- malloc内存块没有释放掉;
- memset与delete之间不能有return,否则存在内存泄漏风险,在delete之前就已经返回了导致内存没有释放掉。这种情况比较难排查,光看系统内存的占用量是看不出来的,需要用专门的工具才能检测出来。
- malloc与free之间不能有return,否则存在内存泄漏风险,在free之前就已经返回了导致内存没有释放掉。同上这种情况也比较难排查。
- 访问了已经释放掉的内存区域;
- 访问了未定义的内存区域;
通过定义到函数模块再检测泄露的具体行就容易多了。
目录
1 valgrind工具安装
2. 工具使用
1 valgrind工具安装
ubuntu下直接使用命令安装:
sudo apt-get install valgrind
2. 工具使用
准备好待检测的c++应用程序,打开终端,使用命令:
valgrind --leak-check=full ./test_progress
工具会一步步检测,并运行你的程序,当程序运行完或者你使用ctrl+c暂定后,工具会输出检测的结果:
你可以试一下你自己的应用程序,打马赛克地方就是程序?可能出现内存泄露的地方,可以具体去查一查,但不一定会存在,正如提示的:“are possibly lost in loss record”。
在最后红色框内是总结的内容:
确定存在内存泄露的:1872字节,这个是肯定需要修复的
间接内存泄露的:0字节
可能存在泄露的:这个也有可能是程序没有结束导致的
目前就学到这些,后续有什么新的心得再更新吧。
|