c++11 - unique_ptr的一个实现

    在单位写代码没法用c++11,为了方便写代码,今天趁着空闲时间写了个unique_ptr的简单实现

//default deleter for unique_ptr
    template<typename T>
    struct DefaultDeleter
    {
        void operator()(T *p)
        {
            if (p)
            {
                delete p;
                p = NULL;
            }
        }
    };

    template<typename T, typename Deleter = DefaultDeleter<T>>
    class unique_ptr
    {
    public:
        //construct 
        unique_ptr(T *pT = NULL);
        //destroy
        ~unique_ptr();

        //not allow copyable
    private:
        unique_ptr(const unique_ptr &);
        unique_ptr&operator=(const unique_ptr &);

    public:
        //reset 
        void reset(T *p);
        //release the own of the pointer
        T *release();
        //get the pointer
        T *get();

    public:
        //convert unique_ptr to bool
        operator bool() const;
        //overload for operator *
        T &operator*();
        //overload for operator ->
        T *operator->();

    private:
        //pointer
        T *m_pT;
        //deleter
        Deleter m_deleter;
        //call deleter
        void del();
    };

    //construct 
    template<typename T, typename Deleter>
    unique_ptr<T, Deleter>::unique_ptr(T *pT) :m_pT(pT)
    {

    }

    //destroy
    template<typename T, typename Deleter>
    unique_ptr<T, Deleter>::~unique_ptr()
    {
        del();
    }

    //call deleter
    template<typename T, typename Deleter>
    void unique_ptr<T, Deleter>::del()
    {
        if (*this)
        {
            m_deleter(m_pT);
            m_pT = NULL;
        }
    }

    //get the pointer
    template<typename T, typename Deleter>
    T *unique_ptr<T, Deleter>::get()
    {
        return m_pT;
    }

    //reset 
    template<typename T, typename Deleter>
    void unique_ptr<T, Deleter>::reset(T *p)
    {
        del();
        m_pT = p;
    }

    //release the own of the pointer
    template<typename T, typename Deleter>
    T *unique_ptr<T, Deleter>::release()
    {
        T *p = m_pT;
        m_pT = NULL;
        return p;
    }

    //convert unique_ptr to bool
    template<typename T, typename Deleter>
    unique_ptr<T, Deleter>::operator bool()const
    {
        return NULL != m_pT;
    }

    //overload for operator *
    template<typename T, typename Deleter>
    T &unique_ptr<T, Deleter>::operator*()
    {
        assert(*this);
        return *m_pT;
    }

    //overload for operator ->
    template<typename T, typename Deleter>
    T *unique_ptr<T, Deleter>::operator->()
    {
        return &*(*this);
    }

 

测试代码

#include <iostream>
#include "unique_ptr.h"

struct Obj
{
    int m_nMyMem;
    Obj()
    {
        std::cout << "[NEWOBJ][Obj] this =" << this << std::endl;
    }
    ~Obj()
    {
        std::cout << "[DELOBJ][~Obj] this =" << this << std::endl;
    }
};

int main(int argc,char *argv[])
{
    unique_ptr<Obj> uptr(new Obj);
    assert(uptr);
    uptr->m_nMyMem = 100;
    std::cout << "nMyMem= " << (*uptr).m_nMyMem << std::endl;
    auto p = uptr.release();
    if (p)
    {
        delete p;
        p = NULL;
    }
    return 0;
}

输出结果 ==>>

        [NEWOBJ][Obj] this =00000000002C7D20
        nMyMem= 100
        [DELOBJ][~Obj] this =00000000002C7D20

 
  
 

 

转载于:https://www.cnblogs.com/ywy2090/p/5808266.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值