zoukankan      html  css  js  c++  java
  • 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。

  • 相关阅读:
    mongoDB简介
    Java中Collection和Collections的区别
    java内存模型-总结
    java内存模型-final
    java内存模型-锁
    java内存模型-volatile
    java内存模型-顺序一致性
    java内存模型-重排序
    java内存模型-基础
    FTPClient listFiles 阻塞问题
  • 原文地址:https://www.cnblogs.com/Oscar67/p/9039413.html
Copyright © 2011-2022 走看看