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下很好地内存检测工具,不仅可以检测内存泄露,如果你需要下面的一篇博客可能会对你有帮助:

http://blog.csdn.net/luxiuwen/article/details/7659128

BoundsChecker:

在window下运行的很强大的哦,同样推荐一篇博客:

http://blog.csdn.net/cwzmb/article/details/3506902

 

简单的内存泄露的例子:

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将内存释放,导致这块内存一直处于占用状态

转载于:https://www.cnblogs.com/Ninac/archive/2013/04/24/3040859.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值