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

    只能指针实现了指针指向对象的共享。同时避免了悬垂指针等问题。

    通过对运算符的重载它可以像普通指针一样的操作。只要有一个智能指针指向

    这个对象,那么这个对象就不会被释放掉。

    
    
    #include<iostream>
    #include<iomanip>
    #include<list>
    #include<cmath>
    #include<vector>
    using namespace std;
    // 引用计数实现智能指针
    template<typename T>
    class U_Ptr
    {
        size_t use;
        T *ip;
        U_Ptr(T *p):ip(p),use(1){}
        template<typename T>
        friend class HasPtr;
        ~U_Ptr(){delete ip;}
    };
    
    template<typename T>
    class HasPtr
    {
    private:
        U_Ptr<T>  *ptr;
    public:
        HasPtr(T *p):ptr(new U_Ptr<T>(p)){}
        HasPtr(const HasPtr &h)
        {
            h.ptr->use++;
            ptr=h.ptr;
        }
        HasPtr& operator=(const HasPtr &h)
        {
            h.ptr->use++;
            if(--ptr->use==0)
                delete ptr; 
            ptr=h.ptr;
        }
        ~HasPtr()
        {
            ptr->use--;
            if(ptr->use==0)
                delete ptr;
        }
        T *operator->()
        {
            return ptr->ip;
        }
        T operator*()
        {
            return *ptr->ip;
        }
        size_t getCount()
        {
            return ptr->use;
        }
    };
    void main()
    { 
        int *p=new int(10);
        HasPtr<int> ptr(p);
        {
            
            HasPtr<int> ptr1=ptr;
            HasPtr<int> ptr2=ptr1,ptr3=ptr;
            cout<<"Count:"<<ptr3.getCount()<<" value:"<<*ptr3<<endl;
        }
        cout<<"Count:"<<ptr.getCount()<<" value:"<<*ptr<<endl;
        
    
        system("pause");
    }
  • 相关阅读:
    在Django中如何使用Redis
    Redis的基本操作
    短信接口的频率限制
    版本控制器git
    windows生成公私钥以及应用
    luffy前台组件的搭建
    周末大作业
    同源策略的解决方案
    全局Response对象和全局异常捕获和日志
    爬虫之代理池搭建
  • 原文地址:https://www.cnblogs.com/dyc0113/p/3202315.html
Copyright © 2011-2022 走看看