在写大型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.bz2valgrind安装:
1. tar -jxvf valgrind-3.12.0.tar.bz2
2. cd valgrind-3.12.0
3. ./configure
4. make
5. sudo make install

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

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

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

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

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

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

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

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

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

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

Valgrind检测出越界的位置。

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

4.内存泄漏

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

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

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

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

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

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

6.两次释放内存

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

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

版权声明


原文链接:https://www.cnblogs.com/developing/articles/10979109.html

Linux:内存泄漏检测工具--Valgrind相关推荐

  1. Linux内存泄漏检测工具 Valgrind使用

    一 .valgrind简介 最近在Linux下程序碰到了内存泄漏的问题,所以在网上找了找Linux下的内存泄漏检测工具,找到了Valgrind这款功能很强大的内存调试.内存泄漏检测以及性能分析.检测线 ...

  2. Linux 内存泄漏检测工具 Valgrind

    Valgrind 是一款 Linux下(支持 x86.x86_64和ppc32)程序的内存调试工具,它可以对编译后的二进制程序进行内存使用监测(C语言中的malloc和free,以及C++中的new和 ...

  3. C++ 内存泄漏检测工具valgrind简单使用

    C++ 内存泄漏检测工具valgrind简单使用 目录 C++ 内存泄漏检测工具valgrind简单使用 valgrind安装 valgrind测试内存泄漏 valgrind安装 通过软件商店下载: ...

  4. C/C++的内存泄漏检测工具Valgrind memcheck的使用经历

    Linux下的Valgrind真是利器啊(不知道Valgrind的请自觉查看参考文献(1)(2)),帮我找出了不少C++中的内存管理错误,前一阵子还在纠结为什么VS 2013下运行良好的程序到了Lin ...

  5. 【安装配置】安装适用于 Linux 的 Windows 子系统 WSL ,完成 Clion 中对内存泄漏检测工具 Valgrind 的配置,亲测可用

    关键词:[Linux] [WSL] [Clion] [Valfrind] 一.前言 今天在回答一个粉丝的评论(关于C++ delete 和 delete[ ])时,引出上面的系列问题,具体流程如下: ...

  6. Unix下C程序内存泄漏检测工具Valgrind安装与使用

    Valgrind是一款用于内存调试.内存泄漏检测以及性能分析的软件开发工具. Valgrind的最初作者是Julian Seward,他于2006年由于在开发Valgrind上的工作获得了第二届Goo ...

  7. 内存泄漏检测工具valgrind神器

    1.1 介绍 Valgrind是一套Linux下,开放源代码(GPL V2)的仿真调试工具的集合.Valgrind由内核(core)以及基于内核的其他调试工具组成.内核类似于一个框架(framewor ...

  8. linux 内存泄露检测工具——valgrind

    valgrind是linux下一个可用调试.查看内存泄露的工具,其官方网站:http://www.valgrind.org/ 使用时可用命令: valgrind -v  --leak-check=fu ...

  9. c linux new使内存耗尽_C/C++的内存泄漏检测工具Valgrind memcheck的使用经历

    Linux下的Valgrind真是利器啊(不知道Valgrind的请自觉查看参考文献(1)(2)),帮我找出了不少C++中的内存管理错误,前一阵子还在纠结为什么VS 2013下运行良好的程序到了Lin ...

最新文章

  1. Eclipse开发初阶之Eclipse安装
  2. ruby简单的基础 4
  3. 成功解决TypeError: 'float' object cannot be interpreted as an integer
  4. UnicodeDecodeError: 'utf-8' codec can't decode byte 0xc7 in position 0: invalid continuation byte
  5. Python Django 配置404和500错误页面
  6. .NET Core 工具中的新内容
  7. hibernate工厂模式_Hibernate锁定模式–乐观锁定模式如何工作
  8. Java与iOS对话:Java对象与Apple plist序列化
  9. python语言逆序符号_python的逆序
  10. 方程组的直接解法和迭代法 python_基于任务驱动的翻转课堂线上教学 ——以《解二元一次方程组复习课》为例...
  11. viso图插入Word中大片空白解决办法
  12. centos8 阿里云yum源_CentOS7更换阿里yum源
  13. JQUERY在线引用地址
  14. 电信光猫该怎么同时连接三个路由器?
  15. 谷粒商城:12.仓储服务 — 仓库管理
  16. 10条设计师应该知道的字体设置技巧
  17. java爬虫12306_java爬虫12306,爬取所有的站点和车次,并导入postgreSQL数据库
  18. Delphi第三方组件--Delphi第三方控件大比拼
  19. 《远见》的读后感作文1000字范文
  20. 【论文阅读】SyncPerf: Categorizing, Detecting, and Diagnosing Synchronization Performance Bugs

热门文章

  1. 云联惠认证时间_警方要求云联惠涉案成员限期投案,是自首寻求轻判的最佳时机...
  2. 香港股市api调用代码返回示例
  3. 解决笔记本windows11充电后,屏幕亮度忽明忽暗的问题
  4. BoredApeYachtClub 无聊猿-NFT 源码解析第一节
  5. SPICE的器件模型
  6. 利用Cadence软件中的Model Editor工具和元器件的模型文本文件创建Spice模型
  7. js美化系统默认Prompt仿APP移动端弹出,可以自行修改
  8. 【优麒麟 UbuntuKylin】他来了他来了!麒麟移动应用环境上线了!
  9. 多字节加法 C语言,编写一个多字节无符号数加法子程序
  10. 流星雨html5,HTML5-流星雨