autoptr的实现

#include<iostream>
using namespace std;

    //智能指针主要 在于即使忘了delete,他也能自己释放堆内存空间,只要能做到这一点,那就是智能指针。。。。。。。。别让new开辟上的空间被重复释
//放,以及别让new开辟的空间没有释放,这就是智能指针。

template<class T>
class Auto_ptr
{
public:
    Auto_ptr(T* ptr=new T)
        :_ptr(ptr)
    {
         cout<<"Auto_ptr: "<<_ptr<<endl;
    }
    ~Auto_ptr()
    {
        delete []_ptr;
        _ptr =NULL;
        cout <<"~Auto_ptr: "<<endl;
    }
    Auto_ptr(Auto_ptr<T>& ap)   //智能指针之管理权的转移
    {       
        _ptr=ap._ptr ;
        ap._ptr =NULL;
    }  
    Auto_ptr<T>& operator=(Auto_ptr<T>& ap)
    {
        if(_ptr != ap._ptr )
        {
        delete[] _ptr;
        _ptr = ap._ptr ;========>> {swap(_ptr, s._ptr);
                                 swap(_pcount, s._pcount);
                               return *this ;}这种写法方便
        ap._ptr = NULL;
        return *this;
        }
    }

    T& operator*()
    {
        return *_ptr;
    }

    T* operator->()
    {
        return _ptr;
    }





private:

    T* _ptr;

};


struct A
{
    A(int a = 0)
        :_a(a)      

    {
        cout<<"A"<<endl;
    }
    int _a;
};

int main()
{
    Auto_ptr<int> ap1(new int(1)) ;
    Auto_ptr<int> ap2(ap1);
    Auto_ptr<int> ap3;
    ap3=ap2;
    *ap3=10;
    Auto_ptr<A> ap4(new A(2));//首先它是对象,其次数据类型是结构体:由大到小观察    
    ap4->_a=5;//ap4._ptr ->_a:调用结构体内部的对象
    return 0;
}



//智能指针实现的第二种方法
#include<iostream>
using namespace std;

template<class T>
class Auto_ptr
{
public:
    Auto_ptr(T* ptr)
        :_ptr(ptr),
        _owner(true)            //多了个owner
    {
        cout<<"_owner:"<<endl;
    }
    Auto_ptr(Auto_ptr& ap)
        :_owner(true)

    {
        _ptr = ap._ptr ;
        ap._owner = false;
    }
    ~Auto_ptr()
    {
        if(_owner)
        {
            delete[] _ptr;
            cout<<"~_owner:"<<endl;
            _ptr = NULL;//1.delete之后一定马上及时置NULL    2.千万不能重复delete东西
        }
        else
        {
            _ptr = NULL;
        }
    }



private:
    T* _ptr;
    bool _owner;
};

int main()
{
    Auto_ptr<int> ap1(new int(1));
    Auto_ptr<int> ap2(ap1);
    return 0;
}

//两者区别:(1)旧方案占的内存大于新方案;(2)旧方案的每个指针都指向同一块空间,会使的变量的值容易被修改,不安全


//定制删除器》》》shared_ptr的传递删除器(deleter)方式比较简单, 只需要在参数中添加具体的删除器函数名, 即可; 注意是单参数函数;
#include<iostream>
#include<memory>

using namespace std;

template<class T>   //定制删除器(new)
struct Del         //是个类,可以当作一个模板参数
{
    void operator()(T* ptr)
    {
        delete ptr;

        cout<<"operator():"<<endl;
    }
};

template<class T,class D=Del<T>>
class  Share_ptr
{
public:
    Share_ptr(T* ptr)
        :_ptr(ptr),
        _pcount(new int(1))
    {
    }
    Share_ptr(T* ptr,D del)
        :_ptr(ptr),
        _pcount(new int(1)).
        _del(del)
    {

    }
    ~Share_ptr()
    {
        _Release();
        _ptr=NULL;
        _pcount=NULL;
    }

    Share_ptr(const Share_ptr<T,D>& sp)
        :_ptr(sp._ptr ),
        _pcount(sp._pcount )//两个指针指向同一块内存
    {
        (*_pcount)++;
    }

    Share_ptr<T,D>& operator=(const Share_ptr<T,D>& sp)
    {
        if(_ptr!=sp._ptr )
        {       //(1)防止自赋值;(2)两个指针管理同一块空间//(3)两个指针分别指向两块空间时
             _Release();
            _ptr=sp._ptr ;      
            _pcount=sp._pcount ;        
            (*_pcount)++;
        }

        return *this;
    }
public:

    void _Release()
      {
           if(--(*_pcount) == 0)

          {
                 _del(_ptr);//delete_ptr;

                 delete _pcount;

          }
     }

private:
    T* _ptr;
    int* _pcount;
    D _del;



};


//仿函数(类,重载了operator[],不是函数像函数)
int main()
{
    Share_ptr<int,Del<int>> sp1(new int[2]);

    Share_ptr<int,Del<int>> sp2(new int[3]);

    Share_ptr<int> sp3(new int[3]);
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值