条款13:以对象管理资源

建立一个Investment类,一个工场函数

class Investment{} ;
Inversment* createInvestment(); // 返回指针,指向Investment继承体系内的动态分配对象

有个函数f调用了createInvestment

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

,上述看起来释放了资源pInv,但是如果"…"区域内一个return语句或者其他抛出异常都将会导致pInv资源未释放;为了确保createInvestment返回的资源总是被释放,我们需要将这些资源放进对象内,当控制流离开函数f,该对象的析构函数会自动释放那些资源;标准程序库提供的auto_ptr正是针对这种形势而设计的;

void f() {
	std::auto_ptr<Investment> pInv(createInvestment());
	// 离开作用域时,经由auto_ptr的析构函数自动删除pIn
	// 注意别让多个auto_ptr指向同一个对象,不然会多次释放
}

auto_ptr有个不寻常的性质:若通过copy构造函数或copy assigment操作符复制它们,它们会变成null,而复制所得的指针将取得资源的唯一拥有权;

std::auto_ptr<Investment> pInv1(createInvestment());
std::auto_ptr<Investment> pInv2(pInv1) //现在pInv2指向对象,pInv1被设为null,
pInv1 = pInv2 //现在pInv指向对象,pInv2被设为null
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值