1.STL的指针auto_ptr当拷贝构造或者赋值时会发生控制权的转移,所以不能被当做元素存储到数组或者标准库的容器中去,当然也不能用指向数组的指针去初始化一个auto_pt对象。下面介绍几个此类的几个关键方法。
ap.reset(p); 如果p与ap的值不相同,则删除ap指向的对象并且将ap绑定到p。
ap.release(); 返回ap所保存的指针并且使ap成为未绑定的。
ap.get(); 返回ap所保存的指针。
2.boost::scoped_ptr/boost::scoped::array。
这两个只能指针不会存在所有权转移的问题,因为他们的拷贝构造函数和=操作符被声明为私有成员。。。重载了*和->操作符;还有一个reset()函数可以手动销毁指向的对象。
3.boost::shared_ptr/boost::shared_array。
该智能指针也重载了*和->操作符;
reset()也是用于显式手动销毁对象的函数;
use_count()用来检查当前指向所管理对象的shared_ptr的个数。
由于采用和引用计数机制来实现共享语意,所以可以存储到STL的容器中去,但是不可避免的出现了循环计数的问题。此问题用boost::weak_ptr来解决。boost::weak_ptr中存储的是指向一个已经由boost::shared_ptr所管理对象的弱引用,其中没有重载operator->。因此当需要访问该对象时,需要将boost::weak_ptr转换为boost::shared_ptr来进行。这种转换可以通过构造一个新的boost::shared_ptr或者调用boost::weak_ptr的lock()方法进行。如果此刻该对象已经不存在了,则这两种方法都将失败。lock()会返回空,而boost::shared_ptr的构造函数将会抛出boost::bad_weak_ptr异常。请看一个例子:
#include <iostream>
#include <boost/smart_ptr.hpp>
using namespace std;
void testptr()
{
boost::shared_ptr<simple> psimple(new simple);
boost::weak_ptr<simple> psimple2(psimple);
// psimple.reset();
if (psimple2.lock())
{
psimple2.lock()->foo();
}
else
{
cout<<"simple is gone"<<endl;
}
try
{
boost::shared_ptr<simple> psimple3(psimple2);
psimple3->foo();
}
catch(boost::bad_weak_ptr)
{
cout<<"simple has gone, can not construct shared_ptr"<<endl;
}
cout<<"exit sharedPtr()"<<endl;
}
int main()
{
testptr();
cout<<"exit main()"<<endl;
return 0;
}
当把psimple.reset()注释掉的时候,没有用该函数销毁对象,这个boost::weak_ptr是可以正常访问的该对象的。
若没注释掉,即会调用该函数来销毁对象,然后再使用boost::weak_ptr就会发生错误!!!