C++中动态资源管理

昨天看到一个知识点觉得挺有意思的,而且自己还不是很清楚,觉得讲得很好。主题是“以对象来管理资源”

C++中用得最多的就是动态的内存分配,程序中的大部分bug也都是源自于内存泄露,这也是C++相较于其他高级语言更复杂的主要原因之一,不过考虑到它强大的功能和超高的效率,这样的复杂度也是应该的,所以上天是公平的,有点扯远了。内存只是我们必须管理的资源之一,其他常用到的资源还包括文件描述符,数据库连接,socket等,不论是哪种资源,我们用完之后必须要归还给操作系统,否则就会出现Memory Leak

看下面一段代码:

#include <iostream>

using namespace std;

class Widget

{

public:

      Widget()

      {

        cout<<"Widget()"<<endl;

      }

 

      ~Widget()

      {

        cout<<"~Widget()"<<endl;

      }

 

};

 

 

Widget* CreateWidget()

{

   Widget* pA = new Widget;

   return pA;

}

void MaybeMemoryLeak()

{

   Widget* p = CreateWidget();

   //....

   //....

   //....

   if(p!=NULL)

      return;

   delete p;

}

int main()

{

    MaybeMemoryLeak();

    cout << "Hello world!" << endl;

    return 0;

}

乍一看,这段代码没有什么问题,仔细一想,这段代码确实有问题,而且问题很大。在函数“MaybeMemoryLeak()”中极有可能发生内存泄露,这段代码执行下来析构函数没有被调用,也就是发生了内存泄露。原因就在于delete p之前函数已经返回了,所以delete p不会执行。

有人肯定会说只要保证在delete p之前不执行return语句就可以了。貌似是这样,但是如果程序都如我们所预想的逻辑那样跑,那也就没有bug一说了。即使我们在delete p之前保证没有return语句

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值