我们都知道,当new一个东西之后,必须delete它。但是问题可能出现在在new和delete之间:比如中间出现了异常,或者return之类的。一种比较好的作法是通过对象来管理:因为当对象的声明周期结束以后,会调用析构函数,而在析构函数中delete,这样的作法就靠谱多了。
需要注意的是,如果使用了p2 = p1 或者直接用p1初始化p2,那么,p1的指针就变为空了!你可以通过get函数来判断是否这个指针为空,也可以通过reset函数赋予它新的指向。
由此可以得出,因为auto_ptr不允许复制,所以容器就不能使用它。相比之下,使用shared_ptr就会没有这么奇怪的事情发生了。
在标准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[].