条款13:以对象管理资源

获得资源后立刻放进管理对象内。

管理对象运用析构函数确保资源被释放。

/***************************auto_ptr********************************
class Investment;
void f()
{
Investment* pivs = createInvestment(); //调用工厂方法创建对象
... //当此处发生错误或提前return, goto之类的,则不会执行到delete
delete pivs; //释放对象

为确保createInvestment返回的资源总是被释放,我们需要将资源放进对象内,当控制流离开f, 该对象的析构函数会自动释放那些资源


//auto_ptr是个类指针(pointer-like)对象, 也就是所谓的智能指针,其析构函数自动对其所指对象调用delete、
//由于auto_ptr被销毁时会自动删除所指对象,所以一定要注意不要让多个auto_ptr指向同一个对象
void f()
{
std::auto_ptr<Investment> pInv(createInvestment());
...
//由auto_ptr的析构函数自动删除pInv
}


//auto_ptr有一个不同寻常的性质,若通过copying函数复制他们,它们变成null, 而复制所得的指针将拥有资源的唯一拥有权
std::auto_ptr<Investment> pInv1(createInvestment()); //pInv1指定资源
std::auto_ptr<Investment> pInv2(pInv1); //pInv1为null, pInv2指向资源
pInv1 = pInv2; //pInv2为null, pInv1指向资源


//auto_ptr并非管理动态资源的神兵利器,比如:STL容器要求其元素发挥“正常的”复制行为,因此这些容器容不得auto_ptr.
由于auto_ptr被销毁时会自动删除它所指之物,所以一定要注意别让多个auto_ptr同时指向同一对象,避免重复删除。

*******************************************************************/

/****************************shared_ptr***************************
auto_ptr的替代方案是“引用计数型智能指针”( Reference-counting smart pointer RCSP )
RCSP类似与垃圾回收,但是无法打破环状引用(cycles of references),例如两个不在被使用的对象互相指
tr1的tr1::shared_ptr就是一个RCSP

void f()
{
...
std::tr1::shared_ptr<Investment> pInv(createInvestment());
...
//由shared_ptr析构函数自动删除
}

void f()
{
...
std::trl::shared_ptr<Investment> pInvl(createInvestment());
std::trl::shared_ptr<Insvestment> pInvl2(pInvl); //pInvl和pInvl2指向同一个对象
pInvl = pInv2; //同上
... //pInvl和pInvl2被销毁,所指对象才被销毁
}
*******************************************************************/


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值