Effective C++条款13:以对象管理资源

假设我们有这样一个类:

class Investment{...};

然后这个类有一个工厂函数:

Investment * createInvestment();

createInvestment调用端使用了函数返回的对象后,有责任删除它,
现在有个f函数履行了这个 任务:

void f()
{
	Investment * p = createInvestment();
	...
	delete p;
}

这看起来没问题,但是如果…区域内有一个过早的return语句。如果return发生了,那么delete p就永远不会执行。此外如果createInvestment在循环内执行或者delete在循环内,而这个循环由于某个continue或goto语句过早退出。还有一种可能是…区域内抛出了异常,这几种情况都导致delete被忽略。

为了确保createInvestment返回的资源总是被释放,我们需要将资源放进对象内,当控制流离开f,该对象的析构函数会自动释放那些资源。
而C++11提供的智能指针正好是针对这种形式而设计的特制产品。

void f()
{
    std::unique_ptr<Investment>p(createInvestment());
	...

}

这个简单的例子示范了以对象管理资源的两个关键想法:
1.获得资源后立刻放进管理对象.
2.管理对象运用析构函数确保资源被释放.

此外的智能指针还有shared_prt,它采用了引用计数的做法。持续追踪共有多少对象指向某个资源,在没人指向它的时候自动删除资源。

注意:使用new或new[]分配内存时可以使用unique_ptr,使用new[]分配内存时,不能使用shared_prt
这里不是为了说明智能指针的用法,而是说明对象管理资源的重要性,想了解更多智能指针的用法可以去百度。

总结:为了防止资源泄露,请使用RAII对象,它们在构造函数中获得资源并在析构函数中释放资源。
2.常用的RAII类有shared_prt、unique_ptr、weak_ptr,不要使用auto_prt在C++11它已经被废除了。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值