int *x;
x = new int[1000];
delete[] x;
x = NULL;
new语句所返回的地址是访问这个内存块的唯一线索,同时也是delete语句用来把这个内存块归还给内存池的唯一线索。
1、分配了一个内存块但忘记了释放它,这是一种严重的错误。这样的内存块将等到程序执行结束时才会被释放掉。
2、会导致内存泄漏的另一种情况是用来保存内存块地址的指针变量作用域问题
void foo()
{
My Class *x;
x = new MyClass();
}
退出函数时,栈空间将被自动收回,因为栈空间是有系统分配系统自动收回的。
当foo()函数结束时,指针变量x将超出它的作用域,这意味着它将不复存在,它的值当然就会丢失。
有两种方法可以用来堵住这样的漏洞:
第一个方法是在return语句之前的某个地方插入一条delete x语句:
void foo(){
MyClass *x;
x = new MyClass();
delete x;
x = NULL;
return;
}
第二个方法是让函数把内存块的地址返回给它的调用者:
MyClass *foo()
{
MyClass *x;
x = new MyClass();
return x;
}
动态内存不存在作用域的问题,一旦被分配,内存块就可以在程序的任何地方使用。
因为动态内存没有作用域,所以必须由程序员来跟踪它们的使用情况,并在不再需要用到它们的时候把它们及时归还给系统。
这里需要特别注意的是,虽然动态分配的内存块没有作用域,但用来保存其地址的指针变量是受作用域影响的。