C++智能指针的实现思路

C++智能指针的实现思路

智能指针是一个模板类,用来存储指针(指向动态分配对象的指针)。

智能指针是通过基本类型(模板类)指针构造类的对象,指针本身就是一个自定义的对象。

当此对象被销毁时,即调用此对象的析构函数,释放此指针。

智能指针其实就是对普通指针的封装,封装成一个类。通过重载*和->两个运算符使得智能指针表现得就像普通指针一样。

智能指针遵从RAII思想。

RAII思想:

能够像指针一样(运算符重载,解引用,指向对象成员)。

对资源进行封装和管理。

RAII思想(资源分配及初始化)(Resource Acquisition Is Initialization)

  • 定义一个类来封装资源的分配与释放。
  • 构造函数中完成资源的分配及初始化。
  • 析构函数中完成资源的清理,可以保证资源的正确初始化和释放
  • 如果对象是用声明的方式在栈上创建局部对象,那么RAII机制就会正常工作,当离开作用域对象会自动销毁而调用析构函数释放资源。

下面是一个简单的智能指针实现示例:

template
class SmartPtr {
public:
    SmartPtr(T* ptr = nullptr) : m_ptr(ptr), m_refCount(new int(1)) {
        // 构造函数,初始化智能指针指向的对象指针和引用计数
    }

    ~SmartPtr(){
        // 析构函数,减少引用计数,如果引用计数为 0,则释放内存
        --(*m_refCount);
        if (*m_refCount == 0) {
            delete m_ptr;
            delete m_refCount;
        }
    }

    SmartPtr(const SmartPtr& other) : m_ptr(other.m_ptr), m_refCount(other.m_refCount) {
        // 拷贝构造函数,复制对象指针和引用计数,并增加引用计数
        ++(*m_refCount);
    }

    SmartPtr& operator=(const SmartPtr& other) {
        // 赋值运算符,释放当前对象的内存,并复制对象指针和引用计数,并增加引用计数
        if (this != &other) {
            if (--(*m_refCount) == 0) {
                delete m_ptr;
                delete m_refCount;
            }
            m_ptr = other.m_ptr;
            m_refCount = other.m_refCount;
            ++(*m_refCount);
        }
        return *this;
    }

    T& operator*() const {
        // 解引用操作符,返回对象指针指向的对象的引用
        return *m_ptr;
    }

    T* operator->() const {
        // 成员访问操作符,返回对象指针
        return m_ptr;
    }

private:
    T* m_ptr;       // 智能指针指向的对象的指针
    int* m_refCount;    // 引用计数指针
};

上述代码使用模板,以支持任何类型的对象的管理。在构造函数中,我们初始化指向对象的指针和引用计数。在析构函数中,我们减少引用计数,并在引用计数为 0 时释放对象的内存。在拷贝构造函数和赋值运算符中,复制对象指针和引用计数,并增加引用计数。在解引用操作符中,返回指向对象的指针,并在成员访问操作符中,返回对象的引用。

智能指针有许多其它实现方式和变体,上述代码只是一个概念性的示例。

该文章会更新,欢迎大家批评指正。

推荐一个零声学院免费公开课程,个人觉得老师讲得不错,
分享给大家:[Linux,Nginx,ZeroMQ,MySQL,Redis,
fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,
TCP/IP,协程,DPDK等技术内容,点击立即学习:
服务器课程:C++服务器

你可能感兴趣的:(C++新特性讲解,c++,开发语言)