C++实现简易版智能指针

#include <iostream>
using namespace std;

template<class T>
class smart_pointer {
private:
    T* _ptr;
    int* _count;

public:
    smart_pointer(T* ptr = nullptr) : _ptr(ptr) {
        if (_ptr) _count = new int(1);
        else _count = new int(0);
    }

    smart_pointer(const smart_pointer* ptr) {
        if (this != &ptr) {
            this->_ptr = ptr._ptr;
            this->_count = ptr._count;
            (*this->_count)++;
        }
    }

    smart_pointer& operator=(const smart_pointer& ptr) {
        if (this->_ptr == ptr._ptr) return *this;

        if (this->_ptr) {
            (*this->_count)--;
            if (*this->_count == 0) {
                delete this->_ptr;
                delete this->_count;
                cout << "dealloc smartPointer" << endl;
            }
        }

        this->_ptr = ptr._ptr;
        this->_count = ptr._count;
        (*this->_count)++;
        return *this;
    }

    T& operator*() { return *(this->_ptr); }//*操作符重载,返回指针指向地址的内容
    T* operator->() { return this->_ptr; }//->操作符重载,返回类型为指针

    ~smart_pointer() {
        (*this->_count)--;
        if (*this->_count == 0) {
            delete this->_ptr;
            delete this->_count;
        }
    }

    int use_count() { return *this->_count; }
};

int main()
{

    smart_pointer<int> ptr(new int(10));
    cout << "value : " << *ptr << ". use count of ptr is : " << ptr.use_count() << endl;
    smart_pointer<int> ptr1;
    ptr1 = ptr;
    cout << " use count of ptr is : " << ptr.use_count() << endl;
    smart_pointer<int> ptr2(new int(11));
    ptr1 = ptr2;
    cout << " use count of ptr is : " << ptr.use_count() << endl;
    ptr = ptr2;
    cout << " use count of ptr is : " << ptr.use_count() << endl;
    return 0;
}

输出:

 可以看到析构函数被调用,自动释放资源

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值