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缺点:

    存在环状引用问题。

posted @ 2015-06-03 16:37  Sawyer Ford  阅读(350)  评论(0编辑  收藏  举报