C++手把手带你实现一个智能指针

本文介绍了C++中智能指针的实现原理,包括为何需要智能指针、如何实现资源管理、拷贝构造和拷贝赋值的处理,以及通过引用计数实现多个智能指针共享对象的机制。
摘要由CSDN通过智能技术生成

为什么需要智能指针?

这个问题承接上一篇文章《C++ 堆,栈,RAII》,在RAII的指引下,我们需要实现一个类来管理资源,将资源和类对象的生命周期进行绑定,这样我们就可以不用手动释放资源了。

那为什么把类实现成 like pointer?

上篇文章中说道,因为C++存在对象切片,而使用指针就避免了这个问题。

我们现在来实现一个智能指针:

首先,我们应该满足资源管理的需求: 构造函数获得资源,析构函数释放资源。

class Type
{
    };

class smart_ptr
{
   
public:
    smart_ptr(Type* ptr = NULL) : m_ptr(ptr) {
   }
    ~smart_ptr() {
   
        delete m_ptr;
    }
private:
    Type* m_ptr;
};

smart_ptr(new Type);

好了,我们这样就实现了一个可以管理 Type 类指针的 smart_ptr

显然,我们这个代码不够通用,只能管理 Type这个类型,我们把 smart_ptr 改成模板,把类型传进去,这样就通用了。

template<typename T>
class smart_ptr
{
   
public:
    smart_ptr(T* ptr = NULL) : m_ptr(ptr) {
   }
    ~smart_ptr() {
   
        delete m_ptr;
    }
private:
    T* m_ptr;
};

我们只需要把smart_ptr(new Type); 改成 smart_ptr<Type>(new Type);,就对Type进行了管理。

这样我们就实现了资源管理的功能,下面我们还需要实现like pointer功能。

指针有什么操作?

T& operator*() const;
T* operator->() const;
operator bool() const;

我们需要实现指针的解引用,-> 运算, bool运算, bool运算这里涉及到一个隐式转换的问题,有机会再说。 注意这里函数括号后面加上const,表示当前成员函数不改变对象成员,这是个好习惯,不清楚的话可以看下我之前的文章。

template<typename T>
class smart_ptr
{
   
public:
    smart_ptr(T* ptr = NULL) : m_ptr(ptr) {
   }
    ~smart_ptr() {
   
        delete m_ptr;
    }
    T& operator*() const {
    return *m_ptr; }
    T* operator->() const {
    return m_ptr; }
    operator bool() const {
    return m_ptr; }
private:
    T* m_ptr;
};
// 测试
class Type
{
   
public:
    int a = 1;
};

smart_ptr<Type> sptr(
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值