Boost简单学习:5 智能指针的共享指针

3239 人浏览 | 时间: 2015-11-14 21:50:22 | 作者: 烫烫烫烫烫烫烫烫

    智能指针boost::shared_ptr基本上类似于boost::scoped_ptr。关键不同之处在于 boost::shared_ptr 不一定要独占一个对象。它可以和其他boost::shared_ptr类型的智能指针共享所有权。 在这种情况下,当引用对象的最后一个智能指针销毁后,对象才会被释放。因为所有权可以在boost::shared_ptr之间共享,任何一个共享指针都 可以被复制,这跟 boost::scoped_ptr是不同的。这样就可以在标准容器里存储智能指针了——你不能在标准容器中存储std::auto_ptr,因为它们在 拷贝的时候传递了所有权。

    因为 boost::shared_ptr 能够共享它所含对象的所有权,所以保存在容器中的拷贝(包括容器在需要时额外创建的拷贝)都是和原件相同的。如前所述,std::auto_ptr做不到 这一点,所以绝对不应该在容器中保存它们。正是有了它,我们才可以在标准容器中安全的使用动态分配的对象:


    #include <boost/shared_ptr.hpp>    
    #include <vector>    
      
    int main()   
    {   
      std::vector<boost::shared_ptr<int> > v;   
      v.push_back(boost::shared_ptr<int>(new int(1)));   
      v.push_back(boost::shared_ptr<int>(new int(2)));   
      
      boost::shared_ptr<int> i1(new int(1));   
      boost::shared_ptr<int> i2(i1);   
      i1.reset(new int(2));  
    }  


    类似于boost::scoped_ptr、boost::shared_ptr类重载了以下这些操作符:operator*、 operator-> 和operator bool,另外还有get和reset函数来获取和重新初始化所包含的对象的地址。上例中定义的2个共享指针i1和i2都引用到同一个int类型的对象。 i1通过new操作符返回的地址显示的初始化,i2通过i1拷贝构造而来。i1接着调用reset,它所包含的整数的地址被重新初始化,不过它之前所包含 的对象并没有被释放,因为i2仍然引用着它。智能指针 boost::shared_ptr记录了有多少个共享指针在引用同一个对象,只有在最后一个共享指针销毁时才会释放这个对象。

    默认情况下,boost::shared_ptr 使用delete操作符来销毁所含的对象。然而,具体通过什么方法来销毁是可以指定的,就像下面的例子:


    #include <boost/shared_ptr.hpp>    
    #include <windows.h>    
      
    int main()   
    {   
      boost::shared_ptr<void> h(OpenProcess(PROCESS_SET_INFORMATION, FALSE, GetCurrentProcessId()), CloseHandle);   
      SetPriorityClass(h.get(), HIGH_PRIORITY_CLASS);   
    }  


   共享指针的构造函数第二个参数是一个函数对象CloseHandle,当h超出其作用域时,将不再调用delete了。


相关阅读