C++动态内存与智能指针

智能指针

智能指针的类型

  1. shared_ptr
    实现共享式拥有的概念(shared ownership)。多个智能指针指向相同的对象,该对象只有在最后一个引用被销毁后释放。
  2. weak_ptr
    允许共享但是不拥有对象。一旦最后一个拥有该对象的智能指针销毁后,任何的weak_ptr会自动置为空。在default和copy 构造函数之外 ,weak_ptr 只提供 “接受一个 shared_ptr” 的构造函数。
  3. unique_ptr
    是 C++11 才开始提供的类型,是一种在异常时可以帮助避免资源泄漏的智能指针。采用独占式拥有,某个时刻只能有一个unique_ptr指向给定的对象。当unique_ptr被销毁时,它所指向的对象也被销毁。
  4. auto_ptr
    被 c++11 弃用,原因是缺乏语言特性如 “针对构造和赋值” 的 std::move 语义,以及其他瑕疵。

auto_ptr 与 unique_ptr 比较

  • auto_ptr 可以赋值拷贝,复制拷贝后所有权转移;unqiue_ptr无拷贝赋值语义,但实现了move语义;
  • auto_ptr 对象不能管理数组(析构调用 delete),unique_ptr可以管理数组(析构调用delete[]);

shared_ptr代码简单实现

template  class share_ptr {
  private:
    class Storage {
      private:
        int count;

      public:
        T *pObj;
        Storage(T *pObject) {
            pObj = pObject;
            count = 1;
        }
        ~Storage() {
            if (pObj)
                delete pObj;
        }
        void addRef() { count++; }
        void remRef() { count--; }
        bool noRefs() { return (count == 0); }
    };
    Storage *storage;

  public:
    share_ptr(T *pObject) { storage = new Storage(pObject); }
    shared_ptr(const shared_ptr &p) {
        storage = p.storage;
        storage->addRef();
    }
    ~share_ptr() {
        storage->remRef();
        if (storage->noRefs()) {
            delete storage;
        }
    }
    share_ptr &operator=(const share_ptr &p) {
        if (this != &p) {
            storage->remRef();
            if (storage->noRefs()) {
                delete storage;
            }
            storage = p.storage;
            storage->addRef();
        }
    }
    T *operator->() { return storage->pObj; }
    T &operator*() { return *(storage->pObj); }
};

参考资料

https://github.com/shrddr/Smartpointers/blob/master/shared_ptr.h

你可能感兴趣的:(C++动态内存与智能指针)