• 智能指针引用计数器版


    前些日子,写过一个普通的智能指针,模拟的是boost中的auto_ptr,今天又写了一个关于boost中的share_ptr,引用计数器智能指针,感觉还行,功能基本实现,设计思想基本上是这么一回事,智能指针类管理资源,引用计数器类管理是否有多个智能指针指向同一个资源,如果有为这个资源设一个引用计数器,计数器值表示有多少个智能指针在使用这个资源,一旦有一个智能指针准备释放这个资源,仅仅对计数器减一,只有当没有智能指针指向这个资源,才真正的释放资源,当然你也可以强制让所有的智能指针释放这个资源,直接delete掉资源,然后将所有的智能指针delete掉。

    下面是我代码:

    #include <iostream>
    
    using namespace std;
    
    
    class Test
    {
    private:
        int n;
    public:
        Test(int m):n(m)
        {}
    
        ~Test(){ cout<<"Test destructor function is called\n"; }
    
        void get(){ cout<<"Test get() is called\n"; }
    };
    
    class CountPtr
    {
    public:
        Test* ptr;
        int usecount;
    public:
        CountPtr(Test* p):ptr(p)
        {
            usecount = 1;
            cout<<"CountPtr constructor function is called\n";
        }
    
        ~CountPtr(){ cout<<"CountPtr destructor function is called\n"; delete ptr;  }
    
    };
    
    class SmartPtr
    {
    private:
        CountPtr* ptr;
    public:
        SmartPtr(Test* p)
        { 
            cout<<"SmartPtr constructor function is called\n";
            ptr = new CountPtr(p);
        }
    
        ~SmartPtr()
        {
            ptr->usecount--;
            if(ptr->usecount == 0)   //只有所有的智能指针都释放资源,才能将资源delete掉
            {
                cout<<"SmartPtr destructor function is called\n";
                delete ptr;
            }
        }
    
        SmartPtr(const SmartPtr& p)  //智能指针拷贝构造函数,因为有了拷贝构造函数才使其他的智能指针才能共享资源,不过这个是针对浅拷贝,深拷贝可以无视
        {
            cout<<"SmartPtr copy constructor function is called\n";
            ptr = p.ptr;
            ptr->usecount++;
        }
    
        SmartPtr& operator=(const SmartPtr& p)  //智能指针赋值构造函数,因为有了赋值构造函数才使其他的智能指针才能共享资源,不过这个是针对浅拷贝,深拷贝可以无视
        {
            cout<<"SmartPtr assign constructor function is called\n";
            if(this == &p)
                return *this;
    
            ptr->usecount--;
            if(ptr->usecount == 0)
            {
                delete ptr;
                ptr = NULL;
            }
    
            ptr = p.ptr;
            return *this;
        }
    
        Test* operator->()
        {    
            return ptr->ptr;
        }
    };
    
    int main()
    {
        {
            SmartPtr ptr(new Test(8));
            ptr->get();
            SmartPtr p1 = ptr;
            SmartPtr p2(new Test(7));
            p2 = ptr;    
        }
        return 0;
    }
  • 相关阅读:
    深度讲解Go语言-学习笔记
    vagrant常用命令
    CentOS7 安装Python虚拟环境 virtualenvwrapper
    《Android开发艺术探索》读书笔记——Cha3.2.3改变布局参数实现View的滑动
    Map接口的实现类 Map的区别
    Java多线程之内存可见性和原子性操作 一 synchronized
    LeetCode 153. Find Minimum in Rotated Sorted Array
    LeetCode 64. Minimum Path Sum
    实现线程同步的几种方式
    IOC的底层原理
  • 原文地址:https://www.cnblogs.com/GODYCA/p/2868112.html
Copyright © 2020-2023  润新知