如何避免内存泄漏

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;
}

动态内存不存在作用域的问题,一旦被分配,内存块就可以在程序的任何地方使用。

因为动态内存没有作用域,所以必须由程序员来跟踪它们的使用情况,并在不再需要用到它们的时候把它们及时归还给系统。

这里需要特别注意的是,虽然动态分配的内存块没有作用域,但用来保存其地址的指针变量是受作用域影响的。

 

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值