美文网首页
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++动态内存与智能指针

    智能指针 智能指针的类型 shared_ptr实现共享式拥有的概念(shared ownership)。多个智能指...

  • C++中的智能指针

    一、智能指针是啥?     在C++中,动态内存的管理是用一对运算符完成的:new和delete。new:在动态内...

  • C++11——动态内存

    智能指针 为了使管理动态内存更容易、更安全,新标准库提供了两种管理动态对象的智能指针类型。智能指针的作用类似于常规...

  • 第12章:动态内存

    #1.动态内存与智能指针1.1 shared_ptr类1.2 直接管理内存1.3 shared_ptr和new结合...

  • 动态内存与智能指针

    在C/C++中,动态内存的使用很容易出问题,因为确保在正确的时间释放内存是极其困难的。有时忘记释放内存就会出现内存...

  • 动态内存与智能指针

    c/c++语言的一大特色是在于可以动态的进行内存管理,而这也是它的难点所在。程序出现问题,原因经常在动态内存管理这...

  • C++中New关键字和命名空间

    动态内存分配 C++中的动态内存分配C++中通过new关键字进行动态内存申请C++中的动态内存申请是基于类型进行的...

  • 智能指针

    C++ 11 智能指针 unique_ptr、shared_ptr 与 weak_ptr C++ 11 中有 un...

  • 智能指针学习

    智能指针 介绍 为了更容易(同时也更安全的管)的使用动态内存,C++11提供了智能指针来管理new出来的内存sha...

  • C++研发工程师笔试题/面试题(1-10)

    1. (1) 简述智能指针的原理;(2)c++中常用的智能指针有哪些?(3)实现一个简单的智能指针。 简述智能指针...

网友评论

      本文标题:C++动态内存与智能指针

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