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

c++简略实现共享智能指针Shared_Ptr<T>

重点:

1.引用计数在堆上(原本应为原子变量)

2.引用计数增加减少需要加锁保证线程安全。

3.内部实现Release函数用于释放资源

4.未实现,增加自定义删除器可以将Release修改为模板函数,传入可调用参数。对于shared_ptr,删除器应当作为构造函数参数传入。故而成员函数需要有std::function对象。

#ifndef SHARED_PTR_SHARED_PTR_H
#define SHARED_PTR_SHARED_PTR_H
#include <mutex>template<typename T>
class Shared_ptr{
public:Shared_ptr(T * row) :_row_ptr(row),_ref_count(new int(1)),_ref_mux(new std::mutex){}~Shared_ptr(){ release(); }//拷贝构造Shared_ptr(const Shared_ptr<T> &sp) :_row_ptr(sp._row_ptr),_ref_count(sp._ref_count),_ref_mux(sp._ref_mux){ add_ref(); }//拷贝赋值Shared_ptr<T>& operator=(const Shared_ptr<T> &sp){if (this->_row_ptr != sp._row_ptr){release();  //释放管理的旧资源_row_ptr = sp._row_ptr;_ref_count = sp._ref_count;_ref_mux = sp._ref_mux;add_ref();}return *this;}public:int& use_count(){ return *_ref_count; }T& operator*(){ return *_row_ptr; }T* operator->(){ return _row_ptr; }T* get(){ return _row_ptr; };void reset(T *sp){if (this->_row_ptr != sp){release();  //释放旧资源,减少引动计数_row_ptr = sp;_ref_count = new int(1);_ref_mux = new std::mutex;} elseadd_ref();}private:T *_row_ptr;int *_ref_count;std::mutex *_ref_mux;//减少引用计数或释放内存void release(){std::unique_lock<std::mutex> lock(*_ref_mux);if (--(*_ref_count) == 0){delete _row_ptr;delete _ref_count;_row_ptr = nullptr; //避免悬空指针_ref_count = nullptr;}}//保证线程安全的前提下加锁增加引用计数void add_ref(){std::unique_lock<std::mutex> lock(*_ref_mux);++(*_ref_count);}
};#endif //SHARED_PTR_SHARED_PTR_H

测试程序:

#include <iostream>
#include <string>
#include "Shared_ptr.h"int main() {Shared_ptr<std::string> ptr1(new std::string("hello"));Shared_ptr<std::string> ptr2(ptr1);std::cout << "ptr2 use_count = " << ptr2.use_count() << "ptr1 use_count = " << ptr1.use_count() << std::endl;Shared_ptr<std::string> ptr3 = ptr2;std::cout << "ptr3 use_count = " << ptr3.use_count() << std::endl;std::cout << *ptr2 << std::endl;auto str = new std::string("ni hao");ptr2.reset(str);std::cout << *ptr2 <<" ptr2 usecount = " << ptr2.use_count() << std::endl;std::cout << ptr1.use_count() << std::endl;return 0;
}

http://www.lryc.cn/news/364547.html

相关文章:

  • 2024会声会影全新旗舰版,下载体验!
  • 使用 Node.js 和 Azure Function App 自动更新 Elasticsearch 索引
  • UE4_Ben_图形52_水下效果处理
  • RabbitMQ小结
  • 中国自动气象站:现代气象观测的中流砥柱
  • 【微信小程序】连接蓝牙设备
  • 基于R语言BIOMOD2 及机器学习方法的物种分布模拟与案例分析实践技术
  • Objective-C之通过协议提供匿名对象
  • C语言基础(一)
  • 机器学习_决策树与随机森林
  • 嵌入式系统日志轮转:实现与性能考量
  • 麦肯锡:ChatGPT等生成式AI应用激增,大中华区增长最快
  • Vue Router 使用教程
  • 银河麒麟解压命令
  • VSCode打开文件总是在当前标签页打开,不是新增标签页
  • Django redirect()函数实现页面重定向
  • 【运维项目经历|029】NTP精准时间同步系统优化项目
  • 机房网络运维服务项目难点与关键点分析
  • MKS AX7680 SERIES 电源使用说明手侧
  • DVWA-XSS(Reflected)
  • Python自动化办公2.0 即将发布
  • 【面试宝藏】Redis 常见面试题解析其二
  • 智慧公厕厂家+智能厕所小程序,构建数字化公厕新体系
  • 使用迁移助手 (SSMA for Oracle) 将Oracle19c数据库迁移到SQL Server2022
  • LabVIEW开发EOL功能测试系统
  • Java finally catch try关键字
  • docker安装mysql8和mysql5.7
  • 通过一个例子,说明Python的责任链设计模式有什么优缺点
  • 场地预定小程序基于FastAdmin+UniApp
  • CrossPrefetch: Accelerating I/O Prefetching for Modern Storage——论文泛读