当前位置: 首页 > news >正文

手撕unique_ptr 和 shareed_ptr

文章目录

  • unique_ptr
  • shared_ptr

unique_ptr

template<class T>
class Unique_ptr
{
private:
    T* ptr=NULL;
public:
	//1、删除默认的拷贝构造函数
    Unique_ptr(Unique_ptr& u) = delete;
    //2、删除默认的复制构造
    Unique_ptr& operator=(Unique_ptr& u) = delete;     
    //有参构造函数
    Unique_ptr(T* p)
    {
        ptr = p;
        cout << "构造" << endl;
    }
    //默认构造函数
    Unique_ptr()
    {
    }
    //析构函数
    ~Unique_ptr()
    {
        if (ptr)
        {
            delete ptr;
            ptr = NULL;
            cout << "析构" << endl;
        }
    }
    //重写带右值的拷贝构造
    Unique_ptr(Unique_ptr&& p)
    {
        ptr = p.ptr;
        p.ptr = NULL;
    }
    //重写传参是右值的复制构造
    Unique_ptr& operator=(Unique_ptr&& p)
    {
	    //防止自赋值
        if(this!=&p){
            ptr = p.ptr;
            p.ptr = NULL;
        }
        return *this;
    }
    
    T* operator->()
    {
        return ptr;
    }
    T& operator*()
    {
        if (ptr)
        {
            return *ptr;
        }
        T a = -1;
        return a;     }
};

shared_ptr

template <typename T>
class myshared_ptr
{
public:
	//有参构造
	myshared_ptr(T* value) //:ptr(value), count(new int(1))
	{
		ptr = value;
		//引用计数+1
		count++;
	}
	//拷贝构造
	myshared_ptr(const myshared_ptr& m) {
		ptr = m.ptr; 
		count = m.count; 
		//引用计数+1
		count++;
	}
	//赋值构造
	myshared_ptr& operator=(const myshared_ptr& m) {
		if (this != &m) {
			ptr = m.ptr; 
			count = m.count;
			//引用计数+1
			count++;
		}
		return *this;
	}
	T& operator->() {
		return this->ptr;
	} 
	~myshared_ptr() {
		count--;
		if (this->count== 0) {
			delete ptr;
			cout << "释放内存空间" << endl;
		}
	}
public:
	T* ptr;
	static int count;
};
template <typename T>
int myshared_ptr<T>::count = 0;

相关文章:

  • 使用 Django 构建 Web 应用程序:症状检测 - 分步指南
  • 【项目管理】第7章 项目立项管理 --知识点整理
  • RocketMQ 02
  • netty启用websocket的压缩机制
  • 实现一个 Markdown 编辑器组件:Vue 3 + Vite + Highlight.js
  • java基础 关键字static
  • 导引头是个啥
  • 反射 tcp
  • DrissionPage移动端自动化:从H5到原生App的跨界测试
  • Linux: 线程控制
  • 企业官网的管理后台包含哪些功能模块详细
  • 本地项目提交到gitee
  • uboot启动过程中无法被打断和进入uboot命令行问题解决(基于2017.09版本uboot)
  • 若依前后端分离版本从mysql切换到postgresql数据库
  • [CISSP] [8] 安全模型,设计和能力的原则
  • Kubernetes 节点磁盘空间空了怎么办?解决 containerd overlay 100%问题
  • 如何创建单独的城市活码?活码能永久使用吗?
  • 理解JSON-RPC 2.0 协议
  • 力扣HOT100之链表:24. 两两交换链表中的节点
  • 1. Git 下载和安装
  • 许昌市网站建设科技/天天外链
  • 做网站的用什么主机好/百度竞价推广账户
  • 做企业网站设计/厦门关键词排名推广
  • 济南网站建设公司晟创未来/头条权重查询站长工具
  • 上海市安全生产建设协会网站/网站开发的流程
  • 上海装修公司网站建设/首页关键词优化价格