C/C++内存泄露故障(Memory Leak Faults)之简单篇

http://blog.csdn.net/acb0y/article/details/6210549

  五类简单的C/C++内存泄露:

      第一种类型:

      type:第一类的MLF故障
      desc: 在完整路径p申请了内存,但在p上无任何的内存释放函数,称为第一类MLF故障。

 

      第二种类型:

      type: 第二类MLF
      desc: pointer是用malloc分配的变量,若存在p且p上存在一个free(pointer),那么pointer的使用是正确的。反之,如果存在两个或两个以上free(pointer),或者 存在一个或一个以上的delete(pointer),则称之为第二类的MLF。

 

      第三种类型:

      type: 第三类MLF
      desc: pointer是用new分配的变量,若存在p且p上存在一个delete(pointer),那么pointer的使用是正确的。反之,如果存在两个或两个以上delete(pointer),或者存在一个或一个以上的free(pointer),则称之为第三类的MLF。

 

      第四种类型:

      type: 第四类MLF
      desc: pointer是用new[]分配的变量,若存在p且p上存在一个delete[],那么pointer的使用是正确的。反之,如果用free或用delete释放,则称之为第四类的MLF。

 

      第五种类型:

      type: 第五类MLF
      desc: 多余的delete和free是第五类MLF

 

      第五种类型:

      type: 第六类MLF
      desc: 当申请内存的pointer发生变化后,用delete和free释放变化后的pointer是第六类MLF。

 

Demo代码如下:

  1. /* 
  2.     FileName: MemoryLeakFaults.cpp 
  3.     Author: ACb0y 
  4.     Create Time: 2011年2月26日22:09:59 
  5.     Last modify Time: 2011年2月26日22:53:04 
  6.  */  
  7.   
  8.   
  9. #include <iostream>   
  10. using namespace std;  
  11. typedef int type;  
  12.   
  13. struct node   
  14. {  
  15.     type data;  
  16.     node * pNext;  
  17. };  
  18.   
  19. /* 
  20.     type:第一类的MLF故障 
  21.     desc: 在完整路径p申请了内存,但在p上无任何的内存释放函数,称为第一类MLF故障。 
  22.  */  
  23. node * MLF_one(node * entry, type value)  
  24. {  
  25.     node * pNew = (node *)malloc(sizeof(node));  
  26.     if (NULL == pNew)  
  27.     {  
  28.         return NULL;  
  29.     }  
  30.       
  31.     pNew->data = value;  
  32.       
  33.     //这里没有对pNew申请的空间进行释放。   
  34.     if (NULL == entry)   
  35.     {  
  36.         return NULL;  
  37.     }  
  38.     pNew->pNext = entry->pNext;  
  39.     entry->pNext = pNew;  
  40.     return pNew;  
  41. }  
  42.   
  43. /* 
  44.     type: 第二类MLF 
  45.     desc: pointer是用malloc分配的变量,若存在p且p上存在一个free(pointer),那么 
  46.           pointer的使用是正确的。反之,如果存在两个或两个以上free(pointer),或者 
  47.           存在一个或一个以上的delete(pointer),则称之为第二类的MLF。 
  48.  */  
  49. void MLF_two()  
  50. {  
  51.     char * str = (char *)malloc(100);  
  52.     delete str;  
  53. }  
  54.   
  55. /* 
  56.     type: 第三类MLF 
  57.     desc: pointer是用new分配的变量,若存在p且p上存在一个delete(pointer),那么 
  58.           pointer的使用是正确的。反之,如果存在两个或两个以上delete(pointer),或者 
  59.           存在一个或一个以上的free(pointer),则称之为第三类的MLF。 
  60.  */  
  61. void MLF_three()  
  62. {  
  63.     int * pNew = new int[100];  
  64.     free(pNew);  
  65. }  
  66.   
  67. /* 
  68.     type: 第四类MLF 
  69.     desc: pointer是用new[]分配的变量,若存在p且p上存在一个delete[],那么 
  70.           pointer的使用是正确的。反之,如果用free或用delete释放, 
  71.           则称之为第四类的MLF。 
  72.  */  
  73. void MLF_four()  
  74. {  
  75.     int * pNew = new int[10];  
  76.     delete pNew;  
  77. }  
  78.   
  79. /* 
  80.     type: 第五类MLF 
  81.     desc: 多余的delete和free是第五类MLF 
  82.  */  
  83. void MLF_five()   
  84. {  
  85.     char * str = "abc";  
  86.     free(str);  
  87. }  
  88.   
  89. /* 
  90.     type: 第六类MLF 
  91.     desc: 当申请内存的pointer发生变化后,用delete和free释放 
  92.           变化后的pointer是第六类MLF。 
  93.  */  
  94. void MLF_six()  
  95. {  
  96.     char * pStr = (char *)malloc(10);  
  97.     ++pStr;  
  98.     free(pStr);  
  99. }  
  100.   
  101. int main()  
  102. {  
  103.     node * pList = (node *)malloc(sizeof(node));  
  104.     MLF_one(pList, 5);  
  105.     MLF_two();  
  106.     MLF_three();  
  107.     MLF_four();  
  108.     MLF_five();  
  109.     MLF_six();  
  110.     return 0;  
  111. }  

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值