Linux下内存问题检测神器Valgrind怎么用

Linux下内存问题检测神器Valgrind怎么用,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。

丰润网站建设公司创新互联建站,丰润网站设计制作,有大型网站制作公司丰富经验。已为丰润上千多家提供企业网站建设服务。企业网站搭建\成都外贸网站建设公司要多少钱,请找那个售后服务好的丰润做网站的公司定做!

在写大型C/C++工程时难免会发生内存泄漏现象,系统编程中一个重要的方面就是有效地处理与内存相关的问题。你的工作越接近系统,你就需要面对越多的内存问题。有时这些问题非常琐碎,而更多时候它会演变成一个调试内存问题的恶梦。 常见的内存问题一共七种:1. 动态内存泄露;2. 资源泄露,比如文件指针不关闭;3. 动态内存越界;4.数组内存越界;5.动态内存double free;6.使用野指针,即未初始化的指针;7.释放野指针,即未初始化的指针。

内存问题非常难定位,对于小工程来说,简单去检查代码中new和delete的匹配对数就基本能定位到问题,但是一旦代码量上升到以万单位时,仅靠肉眼检查来定位问题那就非常困难了,所以我们需要利用工具帮助我们找出问题所在。在Linux系统下内存检测工具首推Valgrind,一款非常好用的开源内存管理框架。Valgrind其实是一个工具集,内存错误检测只是它众多功能的一个,但我们用得最多的功能正是它——memcheck。

该工具可以检测下列与内存相关的问题 :

  • 未释放内存的使用

  • 对释放后内存的读/写

  • 对已分配内存块尾部的读/写

  • 内存泄露

  • 不匹配的使用malloc/new/new[] 和 free/delete/delete[]

  • 重复释放内存

首先安装Valgrind非常简单:

//valgrind下载:
http://valgrind.org/downloads/valgrind-3.12.0.tar.bz2

valgrind安装:1. tar -jxvf valgrind-3.12.0.tar.bz22. cd valgrind-3.12.03. ./configure4. make5. sudo make install

下面开始讲解Valgrind的应用场景。

注意: 下面讨论的所有测试代码都应该使用gcc/g++并且加上-g选项。

1. 使用未初始化的内存(使用野指针)

这里我们定义了一个指针p,但并未给他开辟空间,即他是一个野指针,但我们却使用它了。

Linux下内存问题检测神器Valgrind怎么用

Valgrind检测出我们程序使用了未初始化的变量,但并未检测出内存泄漏。

Linux下内存问题检测神器Valgrind怎么用

2.在内存被释放后进行读/写(使用野指针)

p所指向的内存被释放了,p变成了野指针,但是我们却继续使用这片内存。

Linux下内存问题检测神器Valgrind怎么用

Valgrind检测出我们使用了已经free掉的内存,并给出这片内存是哪里分配哪里释放的。

Linux下内存问题检测神器Valgrind怎么用

3.从已分配内存块的尾部进行读/写(动态内存越界)

我们动态地分配了一段数组,但我们在访问个数组时发生了越界读写,程序crash掉。

Linux下内存问题检测神器Valgrind怎么用

Valgrind检测出越界的位置。

Linux下内存问题检测神器Valgrind怎么用

注意:Valgrind不检查静态分配数组的使用情况!所以对静态分配的数组,Valgrind表示无能为力!比如下面的例子,程序crash掉,我们却不知道为什么。

Linux下内存问题检测神器Valgrind怎么用

Linux下内存问题检测神器Valgrind怎么用

4.内存泄漏

内存泄漏的原因在于没有成对地使用malloc/free和new/delete,比如下面的例子。

Linux下内存问题检测神器Valgrind怎么用

Valgrind会给出程序中malloc和free的出现次数以判断是否发生内存泄漏,比如对上面的程序运行memcheck,Valgrind的记录显示上面的程序用了1次malloc,却调用了0次free,明显发生了内存泄漏!

Linux下内存问题检测神器Valgrind怎么用

上面提示了我们可以使用--leak-check=full进一步获取内存泄漏的信息,比如malloc和free的具体行号。

Linux下内存问题检测神器Valgrind怎么用

5. 不匹配地使用malloc/new/new[] 和 free/delete/delete[]

正常使用new/delete和malloc/free是这样子的:

Linux下内存问题检测神器Valgrind怎么用

Linux下内存问题检测神器Valgrind怎么用

而不匹配地使用malloc/new/new[] 和 free/delete/delete[]则会被提示mismacth:

Linux下内存问题检测神器Valgrind怎么用

Linux下内存问题检测神器Valgrind怎么用

6.两次释放内存

double free的情况同样是根据malloc/free的匹配对数来体现的,比如free多了一次,Valgrind也会提示。

Linux下内存问题检测神器Valgrind怎么用

Linux下内存问题检测神器Valgrind怎么用

当然,Valgrind也不是万能的。Valgrind也有无法找到问题的时候,有些问题只能通过不断的review代码找到了症结。发现问题,解决问题,毕竟是末流。最好的方法,就是不引入内存问题。这可以通过良好的代码风格和设计来实现的。

关于Linux下内存问题检测神器Valgrind怎么用问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注创新互联行业资讯频道了解更多相关知识。

文章题目:Linux下内存问题检测神器Valgrind怎么用
本文路径:https://www.cdcxhl.com/article20/jddpco.html

成都网站建设公司_创新互联,为您提供静态网站网站导航外贸网站建设网站设计网页设计公司营销型网站建设

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联

营销型网站建设