C++11 智能指针的原理

#include<iostream>
using namespace std;
//智能指针:
//1.用起来像指针(不是指针)
//2.会自己对资源进行释放
class CStudent
{
public:
    CStudent()
    {

    }
    void test()
    {
        cout << "CStudent" << endl;
    }
private:
    char* m_pszBuf;
    int m_nSex;
};
//为了对象创建时刻,由他自己决定什么时候释放,程序员不用考虑
//我们可以创建一个类,利用该类的构造和析构(进出作用域自动被编译器调用)的机制。
//来解决资源自动释放问题

//智能指针雏形  需要管理资源
class CSmartPtr
{
public:
    //一定要是一个堆对象
    CSmartPtr(CStudent *obj) {
        m_pobj = obj;
    }
    ~CSmartPtr() {
        if (m_pobj != nullptr) {
            delete m_pobj;
        }
    }

    CSmartPtr& operator=(CSmartPtr&sp) {
        if (m_pobj != nullptr) {
            delete m_pobj;
        }
        m_pobj = sp.m_pobj;
        sp.m_pobj = nullptr;
        return m_pobj;
    }
    CSmartPtr(CSmartPtr&) = delete;
    //因为用起来不像指针,所以我们需要想办法让其对象用起来像是一个指针。
    //像一个指针的写法
    CStudent* operator->() {
        return this->m_pobj;
    }
    CStudent&  operator*() {
        return *this->m_pobj;
    }
    operator bool() {
        return this->m_pobj != nullptr;
    }
    
    
private:
    CStudent* m_pobj;//将资源放入智能指针类中,管理起来
};
int main()
{
    
        CStudent* stu = new CStudent();
        /*CSmartPtr* ptr = new CStudent(stu);*/
        //这里可以完成资源的自动释放R
        CSmartPtr sp(new CStudent());
        CSmartPtr sp3(new CStudent());
        sp3 = sp;//一般不允许这样子,有可能同一个空间被释放两次,这个时候就需要自定义下=运算符
                //但是赋值完之后,sp的内容就没有了
        //sp->test();//不能再这么使用了
        CSmartPtr sp2 = sp;
    
    //1.不允许=号运算符重载
    //2.使用拷贝构造移动的语法,auto_ptr 98的原型
    //3.结合前面的引用计数以及写时拷贝。新的智能指针的写法
    sp->test(); 
    (*sp).test();
    if (sp)
    {
    }
    //但是用起来不像是一个指针,
    /*CStudent* stu = new CStudent(); 正常的申请释放
    if (stu != nullptr)
    {
        delete stu;
        stu = nullptr;
    }*/
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值