程序设计中内存泄露检测方法
内存泄露为计算机的专业用词,指由于疏忽或错误造成程序未能释放已经不再使用的内存的情况。内存泄漏并非指内存在物理上的消失,而是应用程序分配某段内存后,由于设计错误,失去了对该段内存的控制,因而造成了内存的浪费。
内存泄漏会因为减少可用内存的数量从而降低计算机的性能,最终,在最糟糕的情况下,过多的可用内存被分配掉导致全部或部分设备停止正常工作,或者应用程序崩溃。
因此,在程序设计过程中一定要注意内存的管理,尽量从源头上减少内存泄露的发生,而且也要及时利用相关方法和工具对内存使用进行检测,以改善程序的性能。
mtrace
mtrace 简介
mtrace
是 GNU C 程序库中的内存调试函数,用于检测由malloc
、realloc
和free
管理分配的内存使用情况。在头文件<mcheck.h>
中声明及定义,函数原型为:
void mtrace(void);
void muntrace(void);
其中mtrace
函数为内存检测的起点,通常放在程序的起始处,而muntrace
为终止内存检测,如果检测到程序末尾时可以省略。
mtrace 使用实例
设要检测的源程序为 test.c:
1 #include <stdio.h>
2 #include <stblib.h>
3 int main(int argc, const char *argv[])
4 {
5 int *a = (int *)malloc(10);
6 return 0;
7 }
显然这个程序在结束前没有释放指针 a 指向的内存。首先需要在源文件中包含头文件<mcheck.h>
,然后调用内存检测函数mtrace
和muntrace
,此时源程序修改为:
1 #include <stdio.h>
2 #include <stblib.h>
3 #include <mcheck.h>
4 int main(int argc, const char *argv[])
5 {
6 mtrace(); //检测起点
7 int *a = (int *)malloc(10);
8 muntrace(); //检测终点,检测到程序末尾时可以省略不写这个
9 return 0;
10 }
要正确使用mtrace
需首先定义环境变量MALLOC_TRACE
以设置日志(记录)文件:
$ export MALLOC_TRACE=test.log
然后在调试模式下编译 test.c:
$ gcc test.c -o test -g
执行程序,内存检测函数会将检测结果写入日志文件:
$ ./test
但是,检测结果是计算机可阅读的格式,需要将其转换。只要安装mtrace
,就会有一名为mtrace
的 Perl 脚本程序存在,可将检测结果转换为一般人可阅读的格式,在 shell 输入以下指令:
$ mtrace test test.log
编译好的程序test
会寻找环境变量MALLOC_TRACE
并把内存泄漏检测情况输出到里面。mtrace
Perl 脚本程序只是一个分析日志文件的工具,上述源文件的测试结果为:
Memory not freed:
-----------------
Address Size Caller
0x08a99378 0xa at /home/hit9/c/test.c:7
其实上述过程可以写个 Makefile 简化操作:
all:
gcc test.c -o test -g
env MALLOC_TRACE=test.log ./test
mtrace test test.log
Valgrind
Valgrind 是一款用于内存调试、内存泄漏检测以及性能分析的软件开发工具。具体信息可访问 Valgrind 官网。
参考链接
上一篇: 把自己当成打工的,一辈子都是打工的
下一篇:有限单元法简介