关于C++内存泄漏的一个经验教训

       近期写了一段代码,发现有内存泄漏,经多次查找都找不到源点,搞到焦头烂额,最后经同事细心审查,竞是粗心导致的隐藏性错误,为了在以后避免犯同样的错误,有必有记录下来。

       在C++中内存管理是很重要的,特别是在new 出内存后,一定要用到相应的delete释放内存,否则就会出现内存泄漏。其实,一般写代码都会有这种意识,但有时自以为是的操作,却不经意引起内存泄漏。

      具体情况大体是如下:

在一个类中

H:

     class A

   {

private:

int* m_pArrData;

public:

A();

~A():

void Function();

   }


cpp:

A::A()

{

m_pArrData=NULL;

}

A::~A()

{

delete []m_pArrData;

}

void A::Function()

{

m_pArrData=new int[100];

}

本以为成员变量m_pArrData在类析构函数中释放内存就行了,但实际上这样做是存在内存泄漏风险的,这取决于Function()函数调用次用,如果只调用一次,m_pArrData只分配一次内存,当然在对象析构时可以正确释放内存。但是,当Function()函数要被多次调用,每次调用都用申请内存,然而m_pArrData只能指向最后一次申请的内存地址,对象析构后只会释放最后一次new出来的内存,这样之前申请的内存不但没有释放,而且也没有指引,不能被释放,一直被占用,直到电脑重启才会释放,这样会告成严重的内存泄漏。

所以,当用到要new内存的指针成员变量时,在成员函数中new内存时一定要注意。如上Funtion()函数,可以这样修改:

void A::Function()

{

if(NULL!=m_pArrData)

        {

m_pArrData=new [100];

        }

}


或当申请空间大小已知时,直接在构造函数中申请空间,在析构函数中释放。


    

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值