Effective C++ Item13:以对象管理资源

以对象管理资源

假设我们用一个程序库来模拟投资, 各样的投资类型都继承于一个root class:

class Investment
{
 ...
}

这个程序库通过一个工厂函数来返回特定的对象:

Investment* createInvestment();

当我们使用这个返回对象之后, 需要删除他,设计个函数f来做这个事:

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

这个函数其实并不能保证最后一定会delete掉pInv, 因为中间的函数部分可能会直接return,或者抛出异常, 最后的delete语句就不一定会被执行。
许多类似的资源都被动态分配在heap上之后, 被用于单一区块或者函数内, 他们应该在离开那个区块或者函数时被释放,我们可以用智能指针来管理这个资源:

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

这样,无论控制流如何离开区块,一旦对象被销毁, 析构函数自动会被调用,于是资源被释放。

auto_ptr会自动删除他所指向之物,所以我们要注意不能让多个auto_ptr指向同一个对象,否则一个对象会被多次删除,

std::auto_ptr<Investment> pInv(createInvestment());

std::auto_ptr<Investment> pInv2(pInv1); //pInv1 被设置为null

pInv1 = pInv2; //pInv2 被设置为null

收到auto_ptr管理的对象只能有一个auto_ptr指向。
对于多个指针指向同一个对象, 我们可以用shared_ptr

void f()
{
	std::tr1::shared_ptr<Investment> pInv(createInvestment());
	...
}

void f()
{
	std::tr1::shared_ptr<Investment> pInv(createInvestment());
	std::tr1::shared_ptr<Investment> pInv2(pInv1);
	pInv1 = pInv2;
}

这样两个指针都同时指向同一个对象。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值