shared_ptr与weak_ptr的手写实现

C++11的智能指针是RAII(Resource Acquisition Is Initialization)机制的一种体现。详细的介绍请参见原文原文1
对RAII的介绍请参见这里原文2
考察较多的就是shared_ptr的手写实现了,这里不是源码,只是模拟实现。

template<class T> //模板
class Share_ptr
{
    // weak_ptr的friend 
    friend class Weak_ptr<T>; //这里先不用在意,稍后解释
public:
    Share_ptr(T* _ptr) :ptr(_ptr), pCount(new int(1)) //构造
    {}

    Share_ptr(const Share_ptr<T>& s)  // 拷贝构造
    :ptr(s.ptr), pCount(s.pCount) // 这是一个指针
    {
        ++(*pCount); //对引用计数进行++
    }

    ~Share_ptr() //析构
    {
        if (*pCount == 1)
        {
            delete ptr;
            delete pCount;
        }
        else
        {
            --(*pCount);
        }
    }

    Share_ptr<T>& operator=(const Share_ptr<T>& s) //赋值重载
    {
        if (ptr != s.ptr)//排除自我拷贝
        {
            if (--(*pCount) == 0)
            {
                if (ptr)
                {
                    delete ptr;
                }
                delete pCount;
            }
            ptr = s.ptr;
            pCount = s.pCount;
            ++(*pCount); // 注意 
        }
        return *this;
    }

    T& operator*()
    {
        return *ptr;
    }

    T* operator->()
    {
        return ptr;
    }

private:
    T* ptr;
    int* pCount; //这个采用引用计数时的计数器
};

template<class T>
class Weak_ptr
{
public:
    Weak_ptr(const Share_ptr<T>& s) :ptr(s.ptr) //构造
    {}

    T& operator*()
    {
        return *ptr;
    }

    T* operator->()
    {
        return ptr;
    }

private:
    T* ptr;
};
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值