13. Use Objects to manage resources.

以对象管理资源

这里的资源指的是堆内存。

有一投资类:

class Investment { .. };
...
Investment* CreateInvestment();

考虑如下调用:

void f()
{
	Investment* pInv = CreateInvestment();
	...
	delete pInv;
}

调用f()时,如果中途提前退出,或者出现异常导致提前退出函数。
delete pInv;未被调用。就会出现内存泄漏。将返回的指针的释放任务
交给调用者不是一个明智的选择。

为确保CreateInvestment返回的资源总是被释放,我们需要将资源放进对象内,当控制流离开f,该对象的析构函数会自动释放那些资源。实际上这正是隐身于背后的半边想法:把资源放进对象内,我们便可依赖C++的“析构函数自动调用机制”确保资源被释放。

以对象管理资源的两个关键想法:

a. 获得资源后立刻放进管理对象
以对象管理资源的观念常被称为“资源取得时机便是初始化时机(RAII)”。

b. 管理对象运用析构函数确保资源被释放
无论控制流如何离开区块,一旦对象被销毁(例如当对象离开作用域)其析构函数自然会被自动调用,于是资源被释放。

auto_ptr已被废弃,使用shared_ptr即可。
修改CreateInvestment()接口,让其返回shared_ptr。

class Investment { .. };
...
std::shared_ptr<Investment*> CreateInvestment();
void f()
{
	std::shared_ptr<Investment*> pInv = CreateInvestment();
	...
}

不管是中途退出f(),还是异常退出,只要离开pInv的作用域,std::shared_ptr析构函数自动调用,其中会释放拥有的Investment*资源,确保资源释放万无一失。

请记住:

  • 为防止资源泄漏,请使用RAII对象,它们在构造函数中获得资源并在析构函数中释放资源。
  • 两个常被使用的RAII classes分别是std::shared_ptr和auto_ptr。前者通常是较佳选择,因为其copy行为比较直观。若选择auto_ptr,复制动作会使它(被复制物)指向null。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值