boost智能指针小结

来源:互联网 发布:科学冷知识知乎 编辑:程序博客网 时间:2024/06/01 13:47

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就会发生错误!!!

0 0