zoukankan      html  css  js  c++  java
  • 智能指针引用计数器版

    前些日子,写过一个普通的智能指针,模拟的是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;
    }
  • 相关阅读:
    持续集成之Jenkins+sonar自动化部署04
    自动化部署03
    自动化部署02
    自动化部署01
    持续集成之代码质量管理-Sonar
    gitlab-ce安装01
    在Centos7.3安装Zabbix3.4.4服务端
    自动化运维之日志系统上线规范(十)
    自动化运维之日志系统Logstash实践(九)
    自动化运维之日志系统Logstash解耦实践(八)
  • 原文地址:https://www.cnblogs.com/GODYCA/p/2868112.html
Copyright © 2011-2022 走看看