C深入—>内存泄露
先来段基础知识:
在堆内存分配的方式--->动态内存分配,程序在运行的时候用malloc或new申请任意多少的内存,程序员自己负责在何时用free或delete释放内存。动态内存的生存期由我们决定,使用非常灵活,但是问题也很多。
不像Java、VB、.NET以及Lisp都有自己的内存管理和垃圾回收机制,C和C++觉得把堆的管理留给你--->程序员,这样使你编程可以更灵活,可以更好的提高程序的性能,但是带来的问题就是内存管理你必须懂,否则你会看到:“卡到没响应的程序”,常见的一个很难处理的错误->内存泄露就很让很多程序猿头疼。
呵呵呵,是不是觉得我主要学的是Java、C#等等,他们有内存管理和垃圾回收机制,我不用管而很开心的笑了?????
别笑,就是拿C#来说,即使有内存管理和垃圾回收机制也会出现内存泄露的!
”为什么呀?“
因为C#里面的内存管理回收托管堆里面的垃圾,不会处理如:数据库连接字符串,还有一些关于硬件方面的数据。
所以掌握内存有关方面的知识也是很有必要的,即使你是Java、C#等等语言的开发者,也可以提高所开发应用的性能!
下面是一些有关内存检测的工具和使用方法的连接,如果有兴趣也可以自己写一个简单的内存泄露检测工具:
IBM Rational Purify:
IBM出品必属精品,一个面向VC, VB或者Java开发的测试Visual C/C++ 和Java 代码中与内存有关的错误,确保整个应用程序的质量和可靠性。
想了解的:https://www.ibm.com/developerworks/cn/rational/r-cail/#N10043
valgrind:
一个开源的软件,是一个linux下很好地内存检测工具,不仅可以检测内存泄露,如果你需要下面的一篇博客可能会对你有帮助:
BoundsChecker:
在window下运行的很强大的哦,同样推荐一篇博客:
简单的内存泄露的例子:
1 #include<stdio.h>
2 #define MAX 100000
3 int main()
4 {
5 int *p
6 p=(int *)malloc(MAX*sizeof(int));
7 return 0;
8 }
泄露MAX*4个字节的内存,问题是最后没有free(p)
再来个不容易察觉的例子:
1 #include<stdio.h>
2 #define MAX 100000
3 int main()
4 {
5 int *p;
6 int k;
7 p=(int *)malloc(MAX*sizeof(int));
8 printf("input a number");
9 scanf("%d",&k);
10 *p=k;
11 if(*p>0)
12 {
13 return 0;
14 }
15 free(p);
16 return 0;
17 }
如果if里面的语句成立,那么直接return了还是没有执行free(p)
当然前面给的例子都很简单,不是所有的都可以一眼看出来,
想想当你写万行代码时,如果发生内存泄露了该怎么找????
更何况一个比较大的项目。。。。。。。
学会一两个内存泄露检测工具还是很有必要的,当然对于测试人员来说是必须的!
内存泄露和内存溢出的区别:
内存溢出指你申请了10个字节的空间,但是你在这个空间写入11或以上字节的数据,就是溢出
内存泄漏指你用malloc或new申请了一块内存,但是没有通过free或delete将内存释放,导致这块内存一直处于占用状态