C++学习——shared_ptr(智能指针)源码

自己实现简单的shared_ptr功能

#include <iostream>
using namespace std;



template <typename T>
class my_shared_ptr{
private:
    int* count;
    T* my_ptr;
public:
    explicit my_shared_ptr(T* origin_ptr)
    {
        count = new int;
        my_ptr = origin_ptr;
        *count = 1;  //___________?????

    }
    my_shared_ptr(const my_shared_ptr& ptr){
        count = ptr.count;
        (*count)++;
        my_ptr = ptr.my_ptr;
    }

    my_shared_ptr& operator= (const my_shared_ptr& ptr){
        //自反性
        if (ptr.my_ptr == my_ptr)
            return my_shared_ptr(nullptr);

        if (*count == 1)
            this->~my_shared_ptr();
        else
            (*count)--;

        my_ptr = ptr.my_ptr;
        count = ptr.count;
        (*count)++;
        return *this;
    }


    ~my_shared_ptr(){
        delete count;
        count = nullptr;
    }

};



class A{
private:
    int a_;
public:
    A(int a = 0) :a_(a){}
    void show(){
        cout << "show:" << a_ << endl;
    }
};

int main(){
    A* a_ = new A();    //新对象                     
    my_shared_ptr<A> a1(a_);         //a1 引用计数1
    my_shared_ptr<A> a2 = a1;   //a1,a2 引用计数 2
    my_shared_ptr<A> a3(a1);   //a1,a2,a3 引用计数 3
    //a1->show();// 可选 
    A* aa_ = new A(); //新对象2
    my_shared_ptr<A> a4(aa_);
    a4 = a1;    //a1,a2,a3 ,a4 引用计数4  释放aa_
    a2 = a3;     //a2,a3 引用计数 不变


}
//全部释放

主要关键在于如何存储count计数器,用全局变量开销较大,可采用指针的方式,所以指向相同内存空间的类共享count。

posted @ 2018-05-15 09:57  何许  阅读(471)  评论(0编辑  收藏  举报