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;
    }
  • 相关阅读:
    Python基础语法 第2节课(数据类型转换、运算符、字符串)
    python基础语法 第5节课 ( if 、 for )
    python基础语法 第4节课 (字典 元组 集合)
    Python基础语法 第3节课 (列表)
    A. Peter and Snow Blower 解析(思維、幾何)
    C. Dima and Salad 解析(思維、DP)
    D. Serval and Rooted Tree (樹狀DP)
    C2. Balanced Removals (Harder) (幾何、思維)
    B. Two Fairs 解析(思維、DFS、組合)
    D. Bash and a Tough Math Puzzle 解析(線段樹、數論)
  • 原文地址:https://www.cnblogs.com/GODYCA/p/2868112.html
Copyright © 2011-2022 走看看