ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 【C++】智能指针简单实现

【C++】智能指针简单实现

原创 Linux操作系统 作者:风尘_NULL 时间:2018-02-09 17:39:15 0 删除 编辑
自己根据http://blog.csdn.net/lf_2016/article/details/52430895这人的博客做了修改,并对代码做详细的注解
,具体如下:


#include

//删除器类定义,当然也可以定义其他删除器
struct DefaultDel{
    //重载()函数运算符,像调用函数一样调用该类的实例
    void operator()(void *ptr){
        if(ptr==nullptr){
            std::cout<<"fuck ,you shou give a valid ptr!"<<std::endl;



        }else{
            delete ptr;
        }
        std::cout<<"ptr have been delted!"<<std::endl;

    }

};
//D这里表示删除器,D是一个类,重载了函数调用操作符,即可以像函数一样使用这个类
template class SharedPtr {
public:
    //这里设置了默认删除器为del函数
    SharedPtr(T* ptr,D del = DefaultDel());


    //为什么需要复制构造函数和赋值构造函数是因为一个对象可以被多个智能指针指向,而指向只能通过赋值和拷贝做到
    //拷贝构造函数
    SharedPtr(const SharedPtr &sp);
    //赋值运算符重载
    SharedPtr& operator=(const SharedPtr &sp);
    //析构函数
    ~SharedPtr();

    //为什么要重载*和->,是因为智能指针要实现与普通指针一样的操作
    T& operator*();
    T* operator->();
    T* _ptr;

private:
    void release(){
        if(--(*_pCount)==0){
            _del(_ptr);
            delete _pCount;
            _ptr=nullptr;
            _pCount=nullptr;



        }


    }

    int* _pCount;
    D _del;
    //static int _pCount;

};

//构造函数初始化
//ShardPtr sp(new int(12),DefaultDel());
template
SharedPtr::SharedPtr(T* ptr,D del)
:_ptr(ptr),_pCount(new int(1)),_del(del){}


//析构函数,调用release释放资源
template
SharedPtr::~SharedPtr(){

    release();

}



template
SharedPtr::SharedPtr(const SharedPtr &ps){
        _ptr = ps._ptr;

        _pCount=ps._pCount;
        (*_pCount)++;
        //这里为什么不用下面这种方式是智能指针的计数器是共享的,当然把_pCount设置为int静态类型更好
        //_pCount=ps->_pCount+1;
        //这里为什么不用下面这种方式是因为构造函数已经指定了删除器,当然,复制一个也是可以,但是没必要
        //_del=ps._del;
}
template
SharedPtr& SharedPtr::operator=(const SharedPtr &ps){
    if(this != &ps){
        _pCount=ps._pCount;
        (*_pCount)++;
        _ptr = ps._ptr;

    }
    return *this;

}
template
T& SharedPtr::operator*(){

    return *_ptr;


}
template
T* SharedPtr::operator->(){

    return _ptr;

}



void test(){

    SharedPtr sp(new int(1));
    //这里传了一个简单的删除器,DefaultDel实例
    SharedPtr sp1((int *)malloc(sizeof(int)),DefaultDel());

    SharedPtr sa(new int(2));
    sa=sp;
    //这个应该输出为1
    std::cout<<(*sa)<<std::endl;


}
int main()
{
    test();

    std::cout << "Hello world!" << std::endl;
    system("pause");
    return 0;
}


具体效果如下:

</std::endl;
</std::endl;
</std::endl;

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/30221425/viewspace-2150987/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
腾讯科技(深圳)有限公司 DBA

注册时间:2015-04-24

  • 博文量
    76
  • 访问量
    238226