美文网首页
引用计数智能指针

引用计数智能指针

作者: my_passion | 来源:发表于2022-10-10 22:12 被阅读0次

1个简单的 引用计数智能指针

本代码取自陈硕的 github 仓库

https://github.com/chenshuo/recipes/blob/master/basic/counted_ptr.h

(1) Ctor: 默认RCSP是空 RCSP: 目标对象和RC 指针均为空 => 还没产生 RC, 而不是 RC = 0

(2) Copy Ctor: 若右侧RCSP的RC指针非空, 则 RC(原子)加1

(3) Move Ctor: 控制权转交, 源 RCSP 2个指针均置空

(4) Assignment: 调 swap(rhs), 交换两者的内容(2个指针) => 若1侧为默认RCSP, 交换后, 另一侧变为默认RCSP

(5) Dtor: 调 reset(), 若 RC 指针非空, 则 RC(原子)减1, 若减为0, 则 delete 目标对象和RC 内存

#pragma once

// A simple reference counted smart pointer.
// make use of GCC atomic builtins and C++ move semantics
template<typename T>
class counted_ptr
{
private:
    T* ptr_;     // 目标对象指针
    int* count_; // RC 动态内存指针

public:
    
    // (1) Ctor: 若 RCSP 所接管的裸指针为空, RC指针置空; 
    //              => `默认 RCSP 是 空 RCSP: 目标对象和RC 指针均为空 => 还没产生 RC, 而不是 RC = 0`
    //           else, RC指针指向新分配的空间, RC初值为1 
    counted_ptr(T* p = nullptr)
        : ptr_(p),
          count_(p ? new int(1) : nullptr)
    { }
    
    // (2) Copy Ctor: 若右侧RCSP的RC指针非空, 则 RC(原子)加1
    counted_ptr(const counted_ptr& rhs) noexcept
        : ptr_(rhs.ptr_),
          count_(rhs.count_)
    {
        if (count_)
          __atomic_fetch_add(count_, 1, __ATOMIC_SEQ_CST);
    }
    
    // (3) Move Ctor: 控制权转交, 源 RCSP 2个指针均置空
    counted_ptr(counted_ptr&& rhs) noexcept
        : ptr_(rhs.ptr_),
          count_(rhs.count_)
    {
        rhs.ptr_ = nullptr;
        rhs.count_ = nullptr;
    }
    
    // (4) Assignment: 调 swap(rhs)
    counted_ptr& 
    operator=(counted_ptr rhs)
    {
        swap(rhs);
        return *this;
    }
    
    // 交换两者的内容(2个指针) => `若1侧为默认RCSP, 交换后, 另一侧变为默认RCSP`
    void swap(counted_ptr& rhs) noexcept
    {
        T* tp = ptr_;
        ptr_ = rhs.ptr_;
        rhs.ptr_ = tp;

        int* tc = count_;
        count_ = rhs.count_;
        rhs.count_ = tc;
    }
    
    // (5) Dtor: 调 reset() 
    ~counted_ptr()
    {
        reset();
    }
    
    // 若 RC 指针非空, 则 RC(原子)减1, 若减为0, 则 delete 目标对象和RC 内存
    void reset()
    {
        static_assert(sizeof(T) > 0, "T must be complete type");
        if (count_)
        {
            if (__atomic_sub_fetch(count_, 1, __ATOMIC_SEQ_CST) == 0)
            {
                delete ptr_;
                delete count_;
            }
            ptr_ = nullptr;
            count_ = nullptr;
        }
    }
    
    // (6) 获取内部裸指针 
    T* 
    get() const noexcept
    {
        return ptr_;
    }
    
    // (7) 获取内部 RC: (原子)load
    int 
    use_count() const noexcept
    {
        return count_ ? __atomic_load_n(count_, __ATOMIC_SEQ_CST) : 0;
    }
    
    T* 
    operator->() const noexcept
    {
        return ptr_;
    }

    T& 
    operator*() const noexcept
    {
        return *ptr_;
    }
};

相关文章

  • 【C++】智能指针类和OpenCV的Ptr模板类

    智能指针类 引用计数 智能指针(smart pointer)的一种通用实现技术是使用引用计数(reference ...

  • C++智能指针

    引用计数技术及智能指针的简单实现 基础对象类 辅助类 智能指针类 使用测试 参考: C++ 引用计数技术及智能指针...

  • 智能指针 (1)

    目录 为什么要讲讲智能指针, 因为发现很多人根本说不出什么是智能指针, 一说到智能指针就会提引用计数。引用计数不是...

  • C++ 指针特别篇-指针转换和智能指针

    智能指针 智能指针的头文件,#include ① shared_ptr 操作引用计数实现共享式...

  • C++开发心得(持续更新)

    要习惯使用智能指针,避免裸指针。 常见的智能指针有以下几种: std::shared_ptr:(1)引用计数和被管...

  • 智能指针

    智能指针 #include 三种智能指针 shared_ptr 有引用计数,当最后一个share...

  • 智能指针原理,并实现一个简单的智能指针。

    智能指针:实际指行为类似于指针的类对象,它的一种通用实现方法是采用引用计数的方法。 1.智能指针将一个计数器与类指...

  • 引用计数智能指针

    1个简单的 引用计数智能指针 本代码取自陈硕的 github 仓库 (1) Ctor: 默认RCSP是空 RCSP...

  • 标准库:指针

    5.1 RAII 与引用计数 智能指针包括std::shared_ptr/std::unique_ptr/std:...

  • 引用计数与ARC

    一、引用计数原理引用计数就是表示多少个指针指向这个对象,当新的指针指向该对象时引用计数加1,当指针不再指向该对象时...

网友评论

      本文标题:引用计数智能指针

      本文链接:https://www.haomeiwen.com/subject/jrcaartx.html