如何使用Valgrind memcheck工具进行C/C++的内存泄漏检测

系统编程中一个重要的方面就是有效地处理与内存相关的问题。你的工作越接近系统,你就需要面对越多的内存问题。有时这些问题非常琐碎,,而更多时候它会演变成一个调试内存问题的恶梦。所以,在实践中会用到很多工具来调试内存问题。

Valgrind是运行在Linux上一套基于仿真技术的程序调试和分析工具,它包含一个内核——一个软件合成的CPU,和一系列的小工具,每个工具都可以完成一项任务──调试,分析,或测试等。Valgrind可以检测内存泄漏和内存违例,还可以分析cache的使用等,灵活轻巧而又强大,能直穿程序错误的心脏,真可谓是程序员的瑞士军刀。

Valgrind工具包包含多个工具:

这里给大家介绍如何使用Valgrind memcheck工具进行C/C++的内存泄漏检测。memcheck工具主要检查下面的程序错误:

这几个工具的使用是通过命令:valgrind –tool=name 程序名来分别调用的,当不指定tool参数时默认是 –tool=memcheck 。

使用前,需要保证valgrind已经安装:

如果是ubuntu系统,在线安装即可:

使用 valgrind memcheck 方式:

1. 使用未初始化的内存

#include <stdio.h>#include <stdlib.h> int main(void){char *p;char c = *p; //使用未初始化的内存printf("\n [%c]\n",c);return 0;}在上面的代码中,我们尝试使用未初始化的指针“p”,让我们运行 Memcheck 来检查结果:

2. 在内存被释放后进行读/写

#include <stdio.h>#include <stdlib.h> int main(void){char *p = malloc(1);*p = ‘a’;char c = *p;printf("\n [%c]\n",c);free(p);c = *p;//在内存被释放后进行读/写return 0;}调试结果如下:

3. 从已分配内存块的尾部进行读/写

#include <stdio.h>#include <stdlib.h> int main(void){char *p = malloc(1);*p = ‘a’;char c = *(p+1); //从已分配内存块的尾部进行读/写printf("\n [%c]\n",c);free(p);return 0;}调试结果如下:

4. 内存泄露

#include <stdio.h>#include <stdlib.h>//在这次的代码中, 我们申请了一个字节但是没有将它释放int main(void){char *p = malloc(1);*p = ‘a’;char c = *p;printf("\n [%c]\n",c);return 0;}调试结果如下:

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

#include <stdio.h>#include <stdlib.h>#include<iostream> int main(void){char *p = (char*)malloc(1);*p = ‘a’;char c = *p;printf("\n [%c]\n",c);delete p;return 0;}

上面的代码中,我们使用了malloc()来分配内存,但是使用了delete操作符来删除内存。

注意: 使用g++来编译上面的代码,因为delete操作符是在C++中引进的,而要编译C++需要使用g++。

调试结果如下:

6. 两次释放内存#include <stdio.h>#include <stdlib.h> int main(void){char *p = (char*)malloc(1);*p = ‘a’;char c = *p;printf("\n [%c]\n",c);free(p);free(p);return 0;}调试结果如下:

本文转自:。

每当我看天的时候我就不喜欢再说话,每当我说话的时候我却敢看天。

如何使用Valgrind memcheck工具进行C/C++的内存泄漏检测

相关文章:

你感兴趣的文章:

标签云: