C++的对象管理资源的思想

请先看下面的代码:

class Investment { ... };

void f()
{
    Investment* pInv = createInvestment();//factory function
    ...
    delete pInv;
}


其中Investment是作为多态用途的基类,函数f中通过一个工厂函数创建了一个对象,使用结束后通过delete释放资源。这里需要注意的问题是如果f中的程序无法正常执行到pInv,例如提前return,抛出异常等,那么pInv所指向的资源就不能被正确释放,且该对象所保存的资源也不能被释放,因而可能会造成很严重的资源泄漏。

为了解决上面这个问题,可以将资源放入对象,利用C++的“析构函数自动调用”机制,在控制流离开f时,对象就会自动调用析构函数释放那些资源。

1)智能指针

C++中的智能指针是一个“类指针对象”,它在离开作用域时,会自动调用自身的析构函数释放资源。如:

void f()
{
    std::auto_ptr<Investment> pInv(createInvestment());
}

上面的代码中在f中声明一个智能指针,它实质上是一个对象,在离开作用域时,会自动调用自身的析构函数删除掉pInv,因而避免了内存泄漏。

2)对象管理资源

用对象管理资源的思想主要是基于C++的"析构函数自动调用"机制,通常它在资源取得之时就用它来初始化或赋值给某个对象,即每一笔资源在取得的时候就将它放在管理的对象中。

3)计数型智能指针

用上面的智能指针管理资源时,不能有多个智能指针指向该资源,因为删除其中一个,那么另外的指针就指向一个空的对象,删除时,编译器会报"未定义行为"错误。因而,在C++中有如下规定:受智能指针对象管理的资源必须不能有一个以上的智能指针同时指向该资源,这样一来,如果对智能指针执行copy或者assign赋值操作,那么新的指针会指向原来的资源,但旧的指针则会变成null:

std::auto_ptr<Investment> pInv(createInvestment());
std::auto_ptr<Investment> pInv1(pInv); //pInv设为null,pInv1指向对象
pInv = pInv1; //pInv1设为null,pInv1向对象

解决该问题的一个基本思路是使用类似垃圾回收的计数型智能指针,它持续追踪有多少个对象指向某一笔资源,在无指针指向它时将其释放掉。

原文链接: https://www.cnblogs.com/sophia-yun/archive/2013/05/13/3075218.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/88282

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月9日 下午11:31
下一篇 2023年2月9日 下午11:31

相关推荐