首页 > 代码库 > 初探C++内存泄漏学习笔记

初探C++内存泄漏学习笔记

为什么要避免内存泄露呢?

 

分配一块内存,但是忘了释放它,这是一种很严重的错误。这样的内存将等到程序结束之后才会被释放。   

如果程序运行的时间很长,并且在不断申请内存而没有释放内存,迟早会把内存消耗殆尽,导致后面无法申请内存甚

至系统奔溃。

 

 

 

 

 

常见的内存泄漏的几种情况

 

new语句所返回的地址是访问这个内存块的唯一线索,同时也是delete语句把这个内存块还给系统的唯一线索。

int *x;x = new int[100];    //x是唯一线索delete [] x;x=NULL;


 

 

 

 

如果这块内存的地址(保存在x里)丢失了,就会发生内存泄漏问题。

 

例子1

 

int *x;x = new int[100]; x = new int[200]; delete [] x;x=NULL;//此时,第一块内存的地址被第二块内存的地址覆盖了,于是无法释放第一块内存,造成内存泄漏。


 

 

 

 

例子2

 

void foo ( ){     Class * x;     x = new Class();}/*new出来的内存是在堆内,没有作用域限制,但是保存它地址的指针是有作用域限制的。当函数结束后,x不存在,导致内存泄露*/


 


 


如何避免内存泄漏

 

如何避免例2的内存泄漏呢?

 

方法1

 

在函数结束前,插入delete语句。

void foo ( ){     Class * x;     x = new Class();    delete x;    x = NULL;    return;}


 

 

方法2

 

如果还想继续使用这块内存,将内存地址返回。

Class * foo ( ){    Class * x;    x = new Class();   return x;}