C++:智能指针实现

/ C++ / 没有评论 / 1846浏览
//
// Created by 肖乃全 on 2019-01-25.
//

#ifndef EXERCISE_SMARTPOINT_H
#define EXERCISE_SMARTPOINT_H

#include <iostream>

template <class T>
class SmartPtr;


/*
 * 引用计数器 :_count
 * 指向实际空间的指针 : _ptr
 */

template<class T>
class Asistant
{
    friend class SmartPtr<T>;
private:
    Asistant(T *ptr),_count(1),_ptr(ptr)
    {

    }

    ~Asistant()
    {
        delete _ptr;
        _ptr = nullptr;
    }

    int _count; // 计数
    T *_ptr;//
};

//指向辅助类的指针
class SmartPtr
{
public:
    SmartPtr(T *ptr):_p(new Asistant<T>(ptr))
    {

    }

    SmartPtr(const SmartPtr<T> &sp)
    {
        _p = sp._p;
        _p->_count++;
    }
     SmartPtr& operator=(const SmartPtr<T> &sp)
     {
        if(this != sp)
        {
            if(--(_p->_count) == 0)
            {
                delete _p; //会先调用辅助类的析构函数(释放实际空间),再释放辅助类对象空间
            }

            //指向新的辅助空间
            _p = sp._p;
            (_p->_count)++;
        }

        return *this;
     }

     ~SmartPtr()
     {
        if(--(_p->_count) == 0)
        {
            delete _p;
            _p = nullptr;
        }
     }

    T *operator->()
    {
        return _p->_ptr;
    }

    T &operator*()
    {
        return *(_p->_ptr);
    }


private:
    Asistant<T> *_p;

};

#endif //EXERCISE_SMARTPOINT_H