为什么要避免内存泄露呢?
分配一块内存,但是忘了释放它,这是一种很严重的错误。这样的内存将等到程序结束之后才会被释放。
如果程序运行的时间很长,并且在不断申请内存而没有释放内存,迟早会把内存消耗殆尽,导致后面无法申请内存甚
至系统奔溃。
常见的内存泄漏的几种情况
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; }