C++智能指针剖析(下)boost::shared_ptr&其他

标签:weak_ptr   运算   问题:   begin   int()   初始化   输出   模板   允许   

1. boost::shared_ptr

前面我已经讲解了两个比较简单的智能指针,它们都有各自的优缺点。由于 boost::scoped_ptr 独享所有权,当我们真真需要复制智能指针时,需求便满足不了了,如此我们再引入一个智能指针,专门用于处理复制,参数传递的情况,这便是如下的boost::shared_ptr。

boost::shared_ptr 属于 boost 库,定义在 namespace boost 中,包含头文件#include<boost/smart_ptr.hpp> 便可以使用。在上面我们看到 boost::scoped_ptr 独享所有权,不允许赋值、拷贝,boost::shared_ptr 是专门用于共享所有权的,由于要共享所有权,其在内部使用了引用计数。boost::shared_ptr 也是用于管理单个堆内存对象的。

这是比较完善的一个智能指针,他是通过指针保持某个对象的共享拥有权的智能指针。若干个shared_ptr对象可以拥有同一个对象,该对象通过维护一个引用计数,记录有多少个shared_ptr指针指向该对象,最后一个指向该对象的shared_ptr被销毁或重置时,即引用计数变为0时,该对象被销毁。销毁对象时使用的是delete表达式或是在构造shared_ptr时传入的自定义删除器(delete),这后面会有详细讲解,但是shared_ptr指针同样拥有缺陷,那就是循环引用,和线程安全问题,这也在后面讲解。先来模拟实现一下shared_ptr指针。

 1 template <class T>
 2 class SharedPtr
 3 {
 4 public:
 5     SharedPtr(T* ptr = NULL)
 6         :_ptr(ptr)
 7         ,_count(new int(0)){
 8         if (_ptr != NULL) {
 9             ++(*_count);
10         }
11     }
12     SharedPtr(const SharedPtr<T>& sp) 
13         :_ptr(sp._ptr)
14         ,_count(sp._count){
15         if (_ptr != NULL) {
16             ++(*_count);
17         }
18     }
19     SharedPtr<T>& operator=(const SharedPtr<T>& sp) {
20         if (this

C++智能指针剖析(下)boost::shared_ptr&其他

扫一扫手机访问