条款13:以对象管理资源

我们都知道,当new一个东西之后,必须delete它。但是问题可能出现在在new和delete之间:比如中间出现了异常,或者return之类的。一种比较好的作法是通过对象来管理:因为当对象的声明周期结束以后,会调用析构函数,而在析构函数中delete,这样的作法就靠谱多了。

在标准C++中,定义了2种管理资源的对象:auto_ptr和share_ptr。我们先介绍它们。(他们需要#include <memory>)

	auto_ptr<int> p1(new int(1));
	auto_ptr<int> p2(new int(2));
	p2 = p1;
	cout<<*p2<<endl;
	if(p1.get() == NULL)
		p1.reset(new int (3));
	cout<<*p1<<endl;
	return 0;

需要注意的是,如果使用了p2 = p1 或者直接用p1初始化p2,那么,p1的指针就变为空了!你可以通过get函数来判断是否这个指针为空,也可以通过reset函数赋予它新的指向。
由此可以得出,因为auto_ptr不允许复制,所以容器就不能使用它。相比之下,使用shared_ptr就会没有这么奇怪的事情发生了。

	tr1::shared_ptr<int> pt1 (new int (1));
	tr1::shared_ptr<int> pt2 (pt1);
	cout<<*pt1<<" "<<*pt2<<endl;
最后需要注意,这些两种指针只能管理new的对象,并不能管理数组,因为它们的析构函数中使用的是delete而不是delete[].

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值