01.
C/C++运行高效,无论是操作系统内核还是对性有请求的程序(比如游戏引擎)都请求使用C/C++来编写,其实C/C++强大的一点在于能够使用指针自由地节制内存的使用,适时的申请内存以及释放内存,从而做到其他编程语言做不到的高效地运行。然而内存管理是一把双刃剑,用文章源自微观生活(93wg.com)微观生活-https://93wg.com/18824.html
C语言中申请内存以及释放内存的办法是使用 malloc以及free。文章源自微观生活(93wg.com)微观生活-https://93wg.com/18824.html
C++中能兼容C,所以也能使用malloc以及free,面向对象的情况下使用的则是new以及delete,能够自动执行构造函数以及析构函数。文章源自微观生活(93wg.com)微观生活-https://93wg.com/18824.html
在Linux平台,咱们可使用valgrind命令检测C/C++程序是不是内存泄漏。文章源自微观生活(93wg.com)微观生活-https://93wg.com/18824.html
02. valgrind安装文章源自微观生活(93wg.com)微观生活-https://93wg.com/18824.html
debian/ubuntu下安装办法:文章源自微观生活(93wg.com)微观生活-https://93wg.com/18824.html
deng@itcast:~$ sudo apt install valgrind deng@itcast:~$ sudo yum install valgrind文章源自微观生活(93wg.com)微观生活-https://93wg.com/18824.html
安装好valgrind工具以后,下面来看看valgrind的几个利用场景。文章源自微观生活(93wg.com)微观生活-https://93wg.com/18824.html
redhat/centos下安装办法:文章源自微观生活(93wg.com)微观生活-https://93wg.com/18824.html
03. 使用未初始化的内存文章源自微观生活(93wg.com)微观生活-https://93wg.com/18824.html
程序中咱们定义了一个指针p,但并未给他分配空间,但咱们却使用它了。
程序示例:
04. 使用野指针
p所指向的内存被释放了,p变为了野指针,然而咱们却继续使用这片内存。
程序示例:
05. 动态内存越界走访
咱们动态地分配了一片连续的存储空间,但咱们在走访个数组时产生了越界走访。
程序示例:
注意:
valgrind不检查非动态分配数组的使用情况。
06. 分配空间后没有释放
内存泄露的缘由在于咱们使用free或者new分配空间以后,没有使用free或者delete释放内存。
程序示例:
可使用--leak-check=full进一步获取内存泄露的信息,比如malloc具体行号。
07. 不匹配使用delete或者free
一般咱们使用malloc分配的空间,必需使用free释放内存。使用new分配的空间,使用delete释放内存。
程序示例:
08. 两次释放同一块内存
一般情况下,内存分配一次,只释放一次。如果屡次释放,可能会呈现double free。
程序示例:
09. 总结
内存泄漏问题无比难定位,对于小工程项目来讲,简单去检查代码中new以及delete的匹配对数就基本能定位到问题,然而一旦代码量上升到以万单位时,仅靠肉眼检查来定位问题那就无比难题了,所以咱们需要应用工具帮助咱们找出问题所在。在Linux系统下内存检测工具首推Valgrind,一款无比好用的开源内存管理工具。Valgrind实际上是一个工具集,内存过错检测只是它众多功能的一个,但咱们用得至多的功能恰是它——memcheck。
总之,valgrind工具可以检测以下与内存相关的问题 :
· 未释放内存的使用
· 对释放后内存的读/写
· 对已分配内存块尾部的读/写
· 内存泄漏
· 不匹配的使用malloc/new/new[] 以及 free/delete/delete[]
· 重复释放内存
以上就是微观生活(93wg.com)关于“Linux下C以及C++程序中内存泄漏检测”的详细内容,希望对大家有所帮助!
评论