内存条测试工具有哪些(内存条测试工具)

码农有道

码农有道高质量技术文章目录整理(请戳我)

关于码农有道(请戳我)

内存泄漏问题可以说是C/C 工程师无法避免的问题,系统编程中一个重要的方面就是有效地处理与内存相关的问题。你的工作越接近系统,你就需要面对越多的内存问题。有时这些问题非常琐碎, 常见的内存问题主要有下面几种:

使用未初始化的内存;

内存泄露;

使用野指针;

重复释放同一块内存;

动态内存越界;

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

内存方面的问题定位一直是个老大难,对于自己写的demo来说,简单去检查代码中malloc/new和free/delete的匹配对数就基本能定位到问题,但是对于数以万甚至十万行的工程时,仅靠肉眼检查来定位问题那就非常困难了。

所以我们需要利用工具帮助我们找出问题所在。今天介绍一款Linux系统下内存检测工具—valgrind,它一款非常好用的开源内存管理框架。valgrind其实是一个工具集,内存错误检测只是它其中一个功能,但也是我们用的最多的功能。

首先是valgrind的安装,和大多数linux下软件安装一样,也是那三部曲,如下:

tar -jxvf valgrind-3.12.0.tar.bz2;

cd valgrind-3.12.0;

./configure;

make;

make install

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

下面开始讲解Valgrind的应用场景。注意: 下面讨论的所有测试代码都应该使用gcc/g 并且加上-g选项。

使用未初始化的内存

在下面的程序中。我们定义了一个指针p,但并未初始化就使用了,这种情况下valgrind检测出我们程序使用了未初始化的变量,但并未检测出内存泄漏(这里其实还有内存泄露的bug,分配的p未释放)。

内存条测试工具有哪些(内存条测试工具)

内存泄露

内存泄漏的原因在于没有成对地使用malloc/free和new/delete,比如下面的例子。valgrind会给出程序中malloc和free的出现次数以判断是否发生内存泄漏,比如对上面的程序运行memcheck,valgrind的记录显示上面的程序用了1次malloc,却调用了0次free,明显发生了内存泄漏!

使用野指针

野指针也叫悬挂指针,是指向“垃圾”内存的指针,指针p被free或者delete之后,没有置为NULL,这样的p就成为了野指针。

使用“野指针”会让程序出现不确定的行为。 需要注意的是,野指针不是NULL指针,它比NULL指针更容易犯错,因为它不能通过形如 if (NULL == p)的判断语句来预防,关于野指针,更多的内容可见前面的文章C/C 指针使用常见的坑(请戳我)。

下面的程序中,p所指向的内存被释放了,p变成了野指针,但是我们却继续使用这片内存。利用valgrind可以检测出我们使用了已经free掉的内存,并给出这片内存是哪里分配哪里释放的。

同次释放同一块内存

不能对同一块内存释放两次,这种情况利用valgrind检测也会给出提示。如下所示:

动态内存越界

如果我们在程序中动态地分配了一段数组,但我们在访问个数组时发生了越界读写,程序crash掉。也可以用valgrind来检测,如下:

需要注意的是:valgrind只会检查动态分配数组(即分配在堆上的内存)的使用情况!对静态分配的数组,valgrind表示无能为力!比如上面的例子,如果第8行改完int p[3];这种情况下用valgrind是检测不出来的。

当然,任何工具包括valgrind都不是万能的。很多时候valgrind也可能无法找到问题,最好的方法是在平时编码中养成良好的代码风格和程序设计,尽量不引入内存问题。

推荐阅读:

完全整理 | 365篇高质技术文章目录整理

【漫画】为什么MySQL数据库要用B 树存储索引?

Stack的三种含义

编译器的工作过程

【网络编程】高性能网络编程之accept建立连接

专注服务器后台技术栈知识总结分享

发表评论

登录后才能评论