• 引用计数实现智能指针


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

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

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

    
    
    #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");
    }
  • 相关阅读:
    调试跳转动态打印
    PHP对redis操作详解
    SSL证书没有绿锁您与此网站建立的连接并非完全安全解决办法
    63. Unique Paths II
    62. Unique Paths
    40. Combination Sum II
    60. Permutation Sequence
    59. Spiral Matrix II
    批量修改名字的脚本
    57. Insert Interval
  • 原文地址:https://www.cnblogs.com/dyc0113/p/3202315.html
Copyright © 2020-2023  润新知