scoped_ptr, shared_ptr和weak_ptr的都称为智能指针,但是各个的用法都不太一样,

本文就就详细介绍其具体用法以及具体实现方法。

  • 用法介绍

  1. scoped_ptr: “scoped”即作用域的含义,主要用于指针在某个作用域中有效,当离开作用域时,该指针自动释放,这就避免了出现忘记回收内存的情形,同时scoped_ptr的复制构造函数和赋值函数为私有,这样就避免了指针的传递, 示例如下:
  2. scoped<T> g_ptr;
    {
    scoped_ptr<T> ptr(new T);
     g_ptr = ptr;//illegal, because the assign operator is private.
    //T* will deleted when it goes out of this scoped.
    }
    
  3. shared_ptr: 共享所有权的智能指针,当某个对象需要在多个地方使用时,被多个指针引用,此时程序可能就无法确定在何时释放该对象,因此就需要使用“引用计数”的方法,当对象被引用的次数为0时,自动释放该对象,示例代码如下:
  4. shared_ptr<T> g_ptr;
    {
      shared_ptr<T> ptr<new T>; // reference count is 1.
      g_ptr = ptr;  //now reference count is 2
      // when it goes out of this scoped, the reference count is 1
    }
    //the reference count is 1.
    g_ptr->foo();
    
  5. weak_ptr: shared_ptr是强引用,而weak_ptr是弱引用;当使用shared_ptr出现循环引用时,造成内存无法释放,如果 你能预料到此种情况发生,你就应该使用weak_ptr类型;另外weak_ptr不会增加所指对象的引用计数,但是会增加计数器的对象引用计数,这点可以后面的实现中看到这点,详细请点击这里
  • 实现原理

  1. scoped_ptr的实现:其主要是在其析构函数中delete对象,同时将copy constructure 和 assign operator设置为私有,避免了指针的传递,这点比auto_ptr安全的多;另外scoped_array是针对new[]和delete[]的只能指针,具体实现请见附件。
  2. shared_ptr的实现:其主要用到了引用计数,每个指向同一对象shared_ptr都指向同一个计数器,其中计数器的定义如下,当shared_ptr对象复制时,对象引用计数加1,当shared_ptr对象释放时,引用计数减1,当引用计数减为0时,delete所指的对象。具体实现请看附件。
  3. 
    // This class is an internal implementation detail for shared_ptr.
    class SharedPtrControlBlock {
     template <typename T> friend class shared_ptr;
     template <typename T> friend class weak_ptr;
     private:
     SharedPtrControlBlock() : refcount_(1), weak_count_(1) { }
     int refcount_; //对象的引用计数
     int weak_count_; //weak_ptr的引用计数
    };
    
  4. weak_ptr的实现:需要注意的一点weak_ptr需要使用shared_ptr构造,不能直接使用原始指针进行构造,它主要操作的是weak_count_计数器,具体实现请看附件。

更多 >