先来段基础知识:
在堆内存分配的方式--->动态内存分配,程序在运行的时候用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下运行的很强大的哦,同样推荐一篇博客:
简单的内存泄露的例子:
- #include<stdio.h>
- #define MAX 100000
- int main()
- {
- int *p
- p=(int *)malloc(MAX*sizeof(int));
- return 0;
- }
泄露MAX*4个字节的内存,问题是最后没有free(p)
再来个不容易察觉的例子:
- #include<stdio.h>
- #define MAX 100000
- int main()
- {
- int *p;
- int k;
- p=(int *)malloc(MAX*sizeof(int));
- printf("input a number");
- scanf("%d",&k);
- *p=k;
- if(*p>0)
- {
- return 0;
- }
- free(p);
- return 0;
- }
如果if里面的语句成立,那么直接return了还是没有执行free(p)
当然前面给的例子都很简单,不是所有的都可以一眼看出来,
想想当你写万行代码时,如果发生内存泄露了该怎么找????
更何况一个比较大的项目。。。。。。。
学会一两个内存泄露检测工具还是很有必要的,当然对于测试人员来说是必须的!
转载于:https://blog.51cto.com/skyhole/1186002