zoukankan      html  css  js  c++  java
  • auto_ptr和shared_ptr

      《Effective C++》在资源管理一节提到了智能指针,智能指针中最著名的当属auto_ptr和shared_ptr。本文主要研究两者的实现。

    auto_ptr的实现:

    template <class T>
    class auto_ptr
    {
    private:
        T *ptr;
    public:
        explicit auto_ptr(T *p = 0) : ptr(p){}
        ~auto_ptr(){delete ptr;}
        auto_ptr(auto_ptr &rhs) : ptr(rhs.release()){}
        auto_ptr& operator=(auto_ptr &rhs)
        {
            reset(rhs.release());
            return *this;
        }
        T& operator*() const {return *ptr;}
        T* operator->() const {return ptr;}
        T* get() const {return ptr;}
        T* release()
        {
            T *tmp = ptr;
            ptr = 0;
            return tmp;
        }
        void reset(T *p = 0)
        {
            if (p != ptr)
            {
                delete ptr;
                ptr = p;
            }
        }
    };

    参考资料:https://gcc.gnu.org/onlinedocs/gcc-4.6.3/libstdc++/api/a00761_source.html

    auto_ptr的缺点:

      1. 复制或赋值行为不正常,因此不能置于容器中。

      2. 不能用于管理动态分配的数组。

        shared_ptr通过reference counting实现,这里有个简易版本。

    template <class T>
    class countedPtr {
    private:
        T *ptr;
        int *count;
    public:
        explicit countedPtr(T *p = 0) : ptr(p), count(new int(1)) {}
        countedPtr(const countedPtr &rhs) : ptr(rhs.ptr), count(rhs.count) 
        {
            ++*count;
        }
        ~countedPtr()
        {
            dispose();
        }
        countedPtr& operator=(const countedPtr &rhs)
        {
            if (this != &rhs)
            {
                dispose();
                ptr = rhs.ptr;
                count = rhs.count;
                ++*count;
            }
            return *this;
        }
        T& operator*() { return *ptr; }
        T* operator->() { return ptr; }
    private:
        void dispose() 
        {
            if (--*count == 0)
            {
                delete ptr;
                delete count;
            }
        }
    };

    参考资料:

    引用计数智能指针的简单实现

    shared_ptr缺点:

        存在环状引用问题。

  • 相关阅读:
    Python基础知识大总结
    Python基础教程第一章 python基础知识
    XDUOJ 1000-1002题解
    C# PDF格式 下载
    C# 文件(图片)下载
    C# DataTable转List
    C# Excel导入与导出
    C# 文件压缩与解压
    C# 文件流 导入 导出
    C# lambda表达式
  • 原文地址:https://www.cnblogs.com/gattaca/p/4549528.html
Copyright © 2011-2022 走看看