智能指针模拟实现C++

2023-05-16

template<typename T>
class auto_ptr {
    
public:
    auto_ptr(T* ptr = nullptr) : _ptr(ptr) {
        
    }
    auto_ptr(auto_ptr<T>& ap) : _ptr(ap._ptr) {
        ap._ptr = nullptr;
    }
    auto_ptr<T>& operator=(auto_ptr<T>& ap) {
        if(this != &ap) {
            if(_ptr)    delete _ptr;
            _ptr = ap._ptr;
            ap._ptr = nullptr;
        }
        
        return *this;
    }
    ~auto_ptr() {
        delete _ptr;
    }
    T& operator*() {
        return *_ptr;
    }
    T* operator->() {
        return _ptr;
    }
private:
    T* _ptr;
};

template<typename T>
class unique_ptr {
    
public:
    unique_ptr(T* ptr) : _ptr(ptr) {
        
    }
    
    unique_ptr(unique_ptr<T>& up) = delete;
    unique_ptr<T>& operator=(const unique_ptr<T>& up) = delete;
    
    ~unique_ptr() {
        delete _ptr;
    }
    
    T& operator*() {
        return *_ptr;
    }
    
    T* operator->() {
        return _ptr;
    }
    
    
private:
    T* _ptr;
};

template<typename T>
class shared_ptr;

template<typename T> 
class Counter {
    
    friend class shared_ptr<T>;
    
public:
    Counter() : m_refCount(0) {
        
    }
    
    ~Counter() {
        
    }
    
    Counter(const Counter&) = delete;
    Counter<T>& operator= (const Counter<T>&) = delete;
    
private:
    atomic_uint m_refCount;
};

template<typename T>
class shared_ptr {

public:
    shared_ptr(T* ptr = nullptr) : _ptr(ptr), _cnts(new Counter<T>) {
        if(_ptr) {
            _cnts->m_refCount = 1;
        }
    } 
    
    shared_ptr(shared_ptr<T>& sp) : _ptr(sp._ptr), _cnts(sp._cnts) {
        ++_cnts->m_refCount;
    }
    
    shared_ptr<T>& operator=(const shared_ptr<T>& sp) {
        if(this != &sp) {
            if(--(_cnts->m_refCount) == 0 && _ptr) {
                delete _ptr;
                delete _cnts;
            }
            _ptr = sp._ptr;
            _cnts = sp._cnts;
            ++_cnts->m_refCount;
        }
        return *this;
    }
    
    ~shared_ptr() {
        if((--_cnts->m_refCount) == 0 && _ptr) {
            delete _ptr;
            delete _cnts;
        }
    }
    
    T& operator*() {
        return *_ptr;
    }
    
    T* operator->() {
        return _ptr;
    }
    
    int use_count() {
        return _cnts->m_refCount;
    }
    
    T* get() {
        return _ptr;
    }
    
private:
    Counter<T>* _cnts;
    T* _ptr;
};

//辅助型智能指针,配合解决shared_ptr的循环引用问题
template<class T>
class weak_ptr{
public:
	weak_ptr()    //无参
		:_ptr(nullptr)
	{}

	weak_ptr(const weak_ptr<T>& wp)  //weak类型构造
		:_ptr(wp._ptr)
	{}

	weak_ptr(const shared_ptr<T>& sp) //shared_ptr类型构造
		:_ptr(sp.get())
	{}

	weak_ptr<T>& operator= (const shared_ptr<T>& sp)
	{
		_ptr = sp.get();
		return *this;
	}


	//像指针一样使用
	T& operator*()
	{
		return *_ptr;
	}

	T* operator->()
	{
		return _ptr;
	}

private:
	T* _ptr;
};

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

智能指针模拟实现C++ 的相关文章

随机推荐

  • libSVM简介及核函数模型选择

    xfeff xfeff 转自 xff1a libSVM简介及核函数模型选择 1 libSVM简介 训练模型的结构体 struct svm problem 储存参加计算的所有样本 int l 记录样本总数 double y 指向样本类别的组数
  • opencv学习系列教程之一 整体框架

    现在就业人数最多的是计算机专业 xff0c 而这个专业的很多人都是做深度学习 xff0c 或者行为识别这块 xff0c 这讲主要介绍一下很常用的一个工具 opencv 很多人说 xff0c 这是一个程序 xff0c 有些人这是很多算法 xf
  • C/C++ Socket UDP 广播消息的发送与接收

    C C 43 43 Socket UDP 广播消息的发送与接收 局域网内全网段广播消息的IP地址为 xff1a 255 255 255 255 xff0c 向该IP地址发送广播消息 xff0c 局域网下的任何网段的客户机都能收到广播 对于发
  • A* 寻路算法

    A 寻路算法 原文地址 xff1a http www gamedev net reference articles article2003 asp 概述 虽然掌握了 A 算法的人认为它容易 xff0c 但是对于初学者来说 xff0c A 算
  • 防止头文件被重复引用

    一 下划线 属于编程风格的内容 xff0c 对程序没有影响 不用下划线也可以 xff0c 用几个下划线也由个人习惯 二 其实质是一个宏名 由此我们可以防止发生重复定义或声明 假设你的头文件名为head h xff0c 根据习惯 xff0c
  • UDP通信绑定指定IP

    由于测试需要 xff0c 自己用vconfig在自己的虚拟机里添加了很多ip xff0c 实现不同Ip间的通信 UDP客户端向服务器发送报文时 xff0c 绑定会有最近IP原则 xff0c 比如 xff0c 你机器上有如下几个IP xff1
  • C++中两个同名头文件的引用顺序

    明人不说暗话 xff0c 直接上代码 xff1a 这里有两个路径下的同名head h头文件 includea head h define A 100 int funA return A includeb head h define A 20
  • 用户态协议栈学习,DKDK基本用法介绍

    网络数据流 xff0c 先了解一下用户态协议栈在什么位置 这里以DPDK为例 xff1a xff08 目的是为了获得原始的网络数据 xff0c 除了DPDK xff0c socket raw xff0c netmap也能获取获取以太网数据
  • 多旋翼基本组成

    一 总体认识 多旋翼三大系统 机身 动力系统 控制系统 xff08 导航模块 控制模块 决策模块 xff09 二 机身主体 xff1a 机架 xff08 1 xff09 作用 多旋翼的承载平台 xff0c 所有设备都是用机架承载 因此 xf
  • 数据处理(伪)代码:卡尔曼滤波 vs. 卡尔曼平滑

    步骤一 导入csv或txt格式的试验数据 最简洁也是据说读取速度最快的方法是 xff1a pPath span class token operator 61 span span class token string 39 C data o
  • 四旋翼初次组装

    一 四旋翼配置清单 初次尝试组装四旋翼 xff0c 在淘宝上买相关配件 xff0c 进行组装 初次组装 xff0c 比较乱 二 装机步骤 1 xff1a 机臂与上层中心板安装 xff0c 2 5mm螺丝 2 xff1a 香蕉头灌锡 xff0
  • 四轴飞行前检查及解锁

    一 飞行前的检查及注意事项 1 飞控的校正遥控器中 xff0c 每个通道与MP中显示的通道校正条是否一致 xff0c 遥控器控制杆摇动的方向是否正确 2 飞控的校正是否已经完成了全部校正 3 电机的的安装序号是否与飞控OUTPUT的通道数一
  • pixhawk之NSH调试

    一 ardupilot固件 windows环境 前期准备 1 xff1a pix烧录程序 xff0c Arducopter或者library中的example都可以实现 2 xff1a 拔掉SD卡 xff08 脚本中提到的没有SD卡进入ns
  • 目标检测(yolov3)实现---darknet的C语言版本

    环境安装 ubuntu opencv cuda cudnn gt920m 参考 https blog csdn net qq 36362060 article details 80739573 darknet github地址 https
  • C++PrimerPlus学习笔记——第9章内存模型和名称空间(最全最详细)

    注 xff1a 这一章都是理解记忆性的内容 xff0c 因此笔者在某些知识点会将自己的理解话语写上 xff0c 便于可读性和方便理解 本章内容包括 xff1a 单独编译 xff1b 存储持续性 作用域和链接性 xff1b 定位 xff08
  • 图论——拓扑排序及最短路径算法模板

    一 拓扑排序 span class token comment 将入度为0的点写入myQueue span vector span class token operator lt span span class token keyword
  • 2022 PAT 甲级秋 100分

    PAT2022秋 有一题是卡着时间复杂度去做的结果AC了 希望大家也能来一起交流下最优解 踩气球 AC 这道题调试了很久 才开始用的哈希表内存太大了 span class token macro property span class to
  • 十大排序 C++代码

    span class token macro property span class token directive hash span span class token directive keyword include span spa
  • 位运算实现加减乘除、交换

    span class token macro property span class token directive hash span span class token directive keyword include span spa
  • 智能指针模拟实现C++

    span class token keyword template span span class token operator lt span span class token keyword typename span span cla