美文网首页
C++动态内存与智能指针

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

作者: Catcher07 | 来源:发表于2018-07-15 20:47 被阅读0次

    智能指针

    智能指针的类型

    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 T> 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++动态内存与智能指针

          本文链接:https://www.haomeiwen.com/subject/xhqmpftx.html