内存泄露

来源:互联网 发布:pubmed数据库使用方法 编辑:程序博客网 时间:2024/04/20 11:11

 内存泄露是指程序中间动态分配了内存,但是在程序结束时没有释放这部分内存,从而造成那一部分内存不可用的情况,重起计算机可以解决,但是也有可能再次发生内存泄露,内存泄露和硬件没有关系,它是由软件设计缺陷引起的。

应用程序一般使用malloc,realloc,new等函数从堆中分配到一块内存,使用完后,程序必须负责相应的调用free或delete释放该内存

块,否则,这块内存就不能被再次使用,我们就说这块内存泄漏了。所以malloc后一定要free,new了之后一定要delete,creatDC之后一定要deleteDC的。

 

内存泄漏可以分为4类:1. 常发性内存泄漏。发生内存泄漏的代码会被多次执行到,每次被执行的时候都会导致一块内存泄漏。

  2. 偶发性内存泄漏。发生内存泄漏的代码只有在某些特定环境或操作过程下才会发生。常发性和偶发性是相对的。对于特定的环境,偶发性的也许就变成了常发性的。所以测试环境和测试方法对检测内存泄漏至关重要。
 
  3. 一次性内存泄漏。发生内存泄漏的代码只会被执行一次,或者由于算法上的缺陷,导致总会有一块仅且一块内存发生泄漏。比如,在类的构造函数中分配内存,在析构函数中却没有释放该内存,所以内存泄漏只会发生一次。
 
  4. 隐式内存泄漏。程序在运行过程中不停的分配内存,但是直到结束的时候才释放内存。严格的说这里并没有发生内存泄漏,因为最终程序释放了所有申请的内存。但是对于一个服务器程序,需要运行几天,几周甚至几个月,不及时释放内存也可能导致最终耗尽系统的所有内存。所以,我们称这类内存泄漏为隐式内存泄漏。

例子:

void   f1(void)   

  {   
        int   *   p;     
        p   =   new   int;   
  }   
    
  执行了F1函数后,p所分配到的内存地址就丢了。找不回那个int内存了,所以这里的内存泄露了!一般多是指内存分配未回收。

.用   malloc   分配了,但没有用   free   释放。   

  2.用   new   分配了,但没有用   delete   删除。   
  3.用   GlobalAlloc   分配,但没有用   GlobalFree   释放。   
  4.用   new   []   分配的数组,没有用   delete[]   删除,而是用   delete   删除。   
  如:   
      struct   A   {   
            int   num;   
      }   
    
      struct   A*   pa;   
      pa   =   new   A[10];   
      delete   pa;   //应该用delete[]   pa;

原创粉丝点击