自我实现简易的智能指针

UFS 3.1协议学习指南:从链路启动到电源管理的深度解析 存储协议是移动设备性能的基石,UFS 3.1作为主流标准,其链路启动、电源管理和错误恢复机制直接影响设备读写体验。理解UniPro层状态机与DME配置原理,能帮助开发者定位链路训练超时、低功耗唤醒异常等底层问题。在嵌入式开发与存储调优中,掌握协议细节可显著提升驱动稳定性和性能。本文基于UFS 3.1协议10.7.10至10.9.9章节,系统讲解链路启动流程、电源模式切换及错误恢复机制,并分享实操验证与调试经验。 阅读详情

看了《Effective C++》中提到的TR1::shared_ptr,觉得很有用,就想尝试自己实现一个。一开始的想法很直接,就是两个模板参数一个代表所持有的指针类型,一个代表销毁资源的函数类型,默认为delete操作,于是有了第一个版本

 

 
  1. #ifndef SHARE_PTR_H_INCLUDED  
  2. #define SHARE_PTR_H_INCLUDED  
  3. namespace share_ptr  
  4. {  
  5.     template<class T,class Func=void>  
  6.     class share_ptr  
  7.     {  
  8.     public:  
  9.         size_t* pCount;  
  10.         share_ptr(T* pt_,Func destoryFunc_):  
  11.             pt(pt_),destoryFunc(destoryFunc_)  
  12.             {  
  13.                 pCount = new size_t(1);  
  14.             }  
  15.         share_ptr(const share_ptr&sp):  
  16.             pt(sp.pt),destoryFunc(sp.destoryFunc)  
  17.         {  
  18.             pCount=sp.pCount;  
  19.             (*pCount)++;  
  20.         }  
  21.         share_ptr& operator=(const share_ptr&sp)  
  22.         {  
  23.             release(); 
  24.             pt = sp.pt;  
  25.             destoryFunc = sp.destoryFunc;  
  26.             pCount=sp.pCount;  
  27.             (*pCount)++;  
  28.             return *this;  
  29.         }  
  30.         ~share_ptr()  
  31.         { 
  32.             release(); 
  33.         }  
  34.         T& operator*()const  
  35.         {  
  36.             return *pt;  
  37.         }  
  38.         T* operator->()const  
  39.         {  
  40.             return pt;  
  41.         }  
  42.         T* get() const  
  43.         {  
  44.             return pt;  
  45.         }  
  46.     private:  
  47.         T* pt;  
  48.         Func destoryFunc;  
  49.         void release() 
  50.         { 
  51.             *pCount)--; 
  52.             if(*pCount == 0 )  
  53.             {  
  54.                 destoryFunc(pt);  
  55.             } 
  56.         } 
  57.   
  58.     };  
  59.   
  60. // 特化,省略销毁函数时,默认用delete  
  61.   
  62.     template<class T>  
  63.     class share_ptr<T,void>  
  64.     {  
  65.     public:  
  66.         typedef void (*freeFunc)(T* );  
  67.         size_t* pCount;  
  68.         share_ptr(T* pt_):  
  69.             pt(pt_)  
  70.             {  
  71.                 pCount = new size_t();  
  72.                 (*pCount)=1;  
  73.             }  
  74.         share_ptr(const share_ptr&sp):  
  75.             pt(sp.pt)  
  76.         {  
  77.             pCount=sp.pCount;  
  78.             (*pCount)++;  
  79.         }  
  80.         share_ptr& operator=(const share_ptr&sp)  
  81.         {  
  82.             release(); 
  83.             pt = sp.pt;  
  84.             pCount=sp.pCount;  
  85.             (*pCount)++;  
  86.             return *this;  
  87.         }  
  88.         ~share_ptr()  
  89.         {  
  90.             release(); 
  91.         }  
  92.         T& operator*()  
  93.         {  
  94.             return *pt;  
  95.         }  
  96.         T* operator->()  
  97.         {  
  98.             return pt;  
  99.         }  
  100.         T* get() const  
  101.         {  
  102.             return pt;  
  103.         }  
  104.     private:  
  105.         T* pt;  
  106.         void release() 
  107.         { 
  108.             (*pCount)--;  
  109.             if(*pCount == 0 )  
  110.             {  
  111.                 delete pt;  
  112.             }  
  113.         } 
  114.     };  
  115. }  
  116. #endif // SHARE_PTR_H_INCLUDED  

但是这个版本在要定义销毁函数时还需要声明销毁函数类型,用起来很麻烦,而且考虑到销毁函数只能有一个T*的参数,因此考虑将第二个模板参数定义为R,这样销毁函数可以用R (T*)来表示。于是有了第二个版本

 

 
  1. #ifndef SHARE_PTR_H_INCLUDED 
  2. #define SHARE_PTR_H_INCLUDED 
  3. namespace share_ptr 
  4. { 
  5.     template<class T,class FreeFuncRetType=void> 
  6.     class share_ptr 
  7.     { 
  8.     public: 
  9.         typedef FreeFuncRetType(*FreeFuncType)(T*); 
  10.         size_t* pCount; 
  11.         template<class U> 
  12.         share_ptr(U* pt_,FreeFuncType destoryFunc_=NULL):        //定义模板构造函数运用泛化的方式实现类似父类指针指向子类的功能 
  13.             pt(pt_),                                              //确保T*可以被U*初始化 
  14.             destoryFunc(destoryFunc_) 
  15.             { 
  16.                 pCount = new size_t(1); 
  17.             } 
  18.         share_ptr(const share_ptr&sp): 
  19.             pt(sp.pt),destoryFunc(sp.destoryFunc) 
  20.         { 
  21.             pCount=sp.pCount; 
  22.             (*pCount)++; 
  23.         } 
  24.         share_ptr& operator=(const share_ptr&sp) 
  25.         { 
  26.             release();
  27.             pt = sp.pt; 
  28.             destoryFunc = sp.destoryFunc; 
  29.             pCount=sp.pCount; 
  30.             (*pCount)++; 
  31.             return *this; 
  32.         } 
  33.         ~share_ptr() 
  34.         { 
  35.             release(); 
  36.         } 
  37.         T& operator*()const 
  38.         { 
  39.             return *pt; 
  40.         } 
  41.         T* operator->()const 
  42.         { 
  43.             return pt; 
  44.         } 
  45.         T* get() const 
  46.         { 
  47.             return pt; 
  48.         } 
  49.     private: 
  50.         T* pt; 
  51.         FreeFuncType destoryFunc; 
  52.         void release() 
  53.         { 
  54.             (*pCount)--; 
  55.             { 
  56.             if(*pCount == 0 ) 
  57.                 if(destoryFunc) 
  58.                 { 
  59.                     destoryFunc(pt); 
  60.                 } 
  61.                 else 
  62.                 { 
  63.                     delete pt; 
  64.                 } 
  65.             } 
  66.         } 
  67.     }; 
  68. } 
  69. #endif // SHARE_PTR_H_INCLUDED 

这样使用起来就容易多了,但是还是需要有第二个模板参数。有没有可能省略第二个模板参数呢?路还很漫长啊~~

本文出自 “暗日” 博客,请务必保留此出处http://darksun.blog.51cto.com/3874064/1147986

UFS3.1协议实战解析:从Link Training到Command状态机 UFS协议是现代移动与车载存储系统的核心通信规范,其分层架构(M-PHY/UniPro/UFS Layer/Command Set)决定了设备启动可靠性、高低温稳定性及实时数据吞吐能力。理解UFS3.1关键在于掌握Link Training的物理层协同优化机制与Command Descriptor驱动的状态机流转逻辑——前者关乎眼图完整性与Gear切换参数耦合,后者直接影响Command Timeout响应与Task Tag并发管理。该协议不仅支撑2.9GB/s带宽,更通过HPB、Boot Acknowle 阅读详情

相关推荐

【C++】————智能指针

在C++中没有垃圾回收机制,必须自己释放分配的内存,否则就会造成内存泄露。解决这个问题最有效的方法是使用智能指针(smart pointer)。智能指针是存储指向动态分配(堆)对象指针的类,用于生存期的控制,能够确保在离开指针所在作用域时,自动地销毁动态分配的对象,防止内存泄露。智能指针的核心实现技术是引用计数,每使用它一次,内部引用计数加1,每析构一次内部的引用计数减1,减为0时,删除所指向的堆内存。c++中用的最多的是下面三种智能指针。

bhbcdxb123的博客 2813

自己实现一个智能指针

要实现一个智能指针主要实现下面几个函数 1 构造函数 2 拷贝构造函数 3 析构函数 4 赋值运算符函数 5 获取引用计数函数 重点: 1 构造,拷贝构造,析构函数会使引用计数-1. 2 赋值运算符会使之前的引用计数-1。使新赋值过来的引用计数+1 #include <iostream> template<class T> class SmartPtr { public: SmartPtr(T* p = nullptr) { ptr = p;

jeak_yang的博客 757

黑猫带你学UFS协议第23篇:UFS固件升级操作详解(FFU)

摘要:本文介绍了UFS固件更新(FFU)的实现方法与注意事项。根据UFS3.1 JEDEC协议,FFU通过write buffer命令(MODE=0Eh)下载FW固件,随后必须进行power cycle或硬件复位生效。文章详细阐述了FFU操作的10条规则,包括数据分片传输要求、寄存器访问限制等,同时指出协议未明确的厂商实现差异。关键寄存器包括bFFUTimeout、bDeviceFFUStatus和fPermanentlyDisableFwUpdate。

黑猫奥利奥的博客 1万+

几种常用智能指针简单实现

Author:GuangshengZhou QQ: 825672792 智能指针 C++内存回收机制全靠程序员手动解决, 很多时候稍不留神就会存在内存泄漏,造成严重后果。现代C++引入了智能指针,对内存进行动态管理(RAII),极大的提高了C++编程效率。 现在我们来实现几个常用的智能指针(auto_ptr、share_ptr、weak_ptr),加深对智能指针的理解。 auto_ptr 实现 t...

u010158920的博客 640

QT触摸屏开发:如何通过重写事件处理实现精准按键长按检测

本文针对QT触摸屏开发中按键长按检测不精准的常见问题,深入剖析了传统信号机制失效的原因,并提供了通过重写事件处理函数(event)的解决方案。文章详细介绍了创建自定义TouchButton类、直接处理QTouchEvent以实现可靠长按检测的完整步骤与代码示例,并分享了进阶优化与避坑指南,帮助开发者实现跨平台一致的精准交互。

weixin_29207149的博客 95

SAP SD 顾问面试问题 consultant interview questionnaire

以下是我个人目前面试团队 SD顾问问题的小结,希望对大家有所帮助, 也可能有回答错误的地方,希望同行不吝赐教。 也希望各位顾问们讲你们遇到的一些面试问题做个跟贴,方便大家共同进步,谢谢。   面试问题清单:  一、销售订单类型影响: 可用性检查,交货类型,输出,信贷,定价,需求,报表,合作伙伴,文本,不完整日志,交货开票,订单开票,公司间开票,统计组,屏幕顺序组,参数文件...

weixin_33825683的博客 1809

C++智能指针以及自我实现

为什么需要智能指针 我们知道,内存泄漏是一件非常严重的错误,这要求如果malloc内存就一定要有对应的free,new了内存也一定要有对应的delete。但是如果程序员忘记写上对应的释放空间的操作符或者函数,那么就会出现内存泄漏,或者程序员写上了,但是中间某个逻辑导致程序崩溃了,并没有走释放空间的语句,那么也会造成内存泄漏,因此,为了防止内存泄漏的发生,C++11中引入了智能指针来管理空间。 内存泄漏 什么是内存泄漏:内存泄漏指因为疏忽或错误造成程序未能释放已经不再使用的内存的情况。内存泄漏并不是指内存

qq_44819750的博客 502

OpenCv案例(七): 基于OpenCvSharp计算图像的清晰度(自动对焦)

自动对焦,其实是对相机成像的清晰值得计算,若对焦不清晰,成像的清晰度低,视觉效果模糊。若是在工业检测行业,对焦不准确,可能会造成严重后果;对焦准确的图像,其清晰度高,对比度鲜明,层次明显。

qq_37835727的博客 7114

自我实现C++智能指针

实现c++智能指针代码展示代码分析1代码展示2代码分析 代码展示 代码分析 1代码展示 下面展示c++智能指针实现的代码 // An highlighted block #include <iostream> 2代码分析 ...

qq_27577503的博客 170

单细胞RNA测序数据分析与可视化:从基础原理到高级应用

单细胞RNA测序(scRNA-seq)技术通过解析单个细胞的基因表达谱,显著提升了我们对细胞异质性的理解。本文详细介绍了scRNA-seq数据分析的完整流程,包括数据预处理、质量控制、降维、聚类、差异表达分析、细胞类型注释、细胞周期分析、轨迹分析、RNA速率分析、基因集富集分析、细胞通讯分析、批次效应校正以及空间转录组学整合。文章还展示了scrna_toolkit包在简化分析流程和增强数据可视化方面的应用。通过这一工具,研究者可以更高效地处理单细胞数据,揭示复杂的生物学信息。未来,该工具将进一步整合多组学分

2301_80338712的博客 4131

目前最新NIST随机数测试软件下载、安装、及使用教程

最近由于科研需要,在搞一些随机数的测试的事情,众所周知 随机数测试我们可以使用NIST的软件进行多大15项的随机测试,我也在网上查找了很多大牛的博客,但是都是年代久远,很多的链接现在都是物是人非,都是不能直接使用了,今天顺便抽点时间更新一下这个NIST软件的下载及使用。我们首先讲一下该软件的下载:1.我们直接取NIST的官网(https://csrc.nist.gov/)下载即可 ;链接如下:下载...

Miracle.Zhao的博客 3万+

智能指针

一、什么是智能指针 智能指针就是用一个对象维护另一个内存空间,当我们new出一块空间地址后,就不用手动的去delete它,而是交给智能指针帮我们做这件事。简单的说智能指针就是自动的帮我们释放new的内存,而不用手动释放。智能指针实现的原理就是通过调用析构函数来间接释放new的内存。 二、auto_ptr使用方法 #include <iostream> #include <memo...

子居的博客 419

Xilinx ERNIC RoCEv2 FPGA实现与QP队列深度解析

本文深入解析Xilinx ERNIC RoCEv2在FPGA上的实现,重点剖析QP队列对的管理机制与深度优化策略。通过Verilog代码示例和工程实战,详细介绍了如何实现高吞吐量、低延迟的RDMA硬件卸载方案,为金融交易和数据中心应用提供性能优化指导。

solidity8miner的博客 877

【C++11】智能指针深度详解(什么是智能指针?为什么需要智能指针?如何使用智能指针?)

智能指针这个名词听着挺唬人,其实也没啥,无非就是会自动销毁new出来的对象,对于日常使用来说,还是挺方便的,毕竟C/C++可没有隔壁Java的垃圾回收机制GC,得自己清理垃圾,智能指针可以自动完成垃圾清理这个工作

weixin_45031801的博客 7672

ubuntu:E: 无法定位软件包yum解决方法

如果出现以下问题,则需要更新yum源 yum源位于/etc/apt/sources.list yum源更新的网站有 清华大学开源镜像 中科大开源镜像 1.此处更新yum源的时候先备份 sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak sudo gedit /etc/apt/sources.list 将更新源替换成上面符合版本系列号 我用的版本号为20.04 # 默认注释了源码镜像以提高 apt update 速度,如有需要可自行取消注释

码农研究僧的博客 1万+

【WorkBuddy专栏61】字节的AI打法为什么一直在变——WorkBuddy/CodeBuddy vs 字节Trae/TRAE Work/豆包全维度对比

【WorkBuddy专栏61】字节的AI打法为什么一直在变——WorkBuddy/CodeBuddy vs 字节Trae/TRAE Work/豆包全维度对比

AI人人懂 2764

C++ 智能指针简易实现

C++ 智能指针的实现原理(简易版)

PX1525813502的博客 1708

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

C++自制简易版智能指针实现过程分析

1. 引言 C++中,由于没有垃圾回收机制,当程序员申请了某些资源(譬如new 某个对象A),如果程序员自己负责释放这些资源,则很可能会产生内存泄露,因此现代C++11引进了智能指针来尽量降低资源泄露的可能。本博客便是我自己在学习more effective C++ 的过程,记录自制简易版智能指针的过程。方便以后复习。 2. 智能指针的定义以及粗略实现 2.1 智能指针的定义 智能指针是看起来、用起来像C++内建指针的对象 2.2 智能指针SmartPtr的粗略实现 智能指针可以像内建指针一样.

qls315的博客 523

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

C++:智能指针

本文介绍了智能指针的概念和原理,以及C++标准库中的auto_ptr、unique_ptr和shared_ptr三种智能指针,分析了shared_ptr中的循环引用问题,并由shared_ptr的循环引用问题出发点,介绍了weak_ptr。

weixin_43908419的博客 8673

c++智能指针(unique_ptr、shared_ptr)的简易实现

具体而言,就是这样,如下所示,当我们创建这个智能指针对象时,这个对象资源就被放在了栈上,当。而。

qq_58158950的博客 1859

C++实现智能指针

#include <iostream> #include <memory> using namespace std; // 智能指针自我实现 template <typename T> class MyAutoPtr { private: T * _ptr; int * _count; public: MyAutoPtr(T* pt = nullptr)...

子居的博客 198

C++智能指针简易实现

为什么需要智能指针 智能指针的作用在于帮助程序员回收不再使用的内存。c/c++程序员都知道,堆内存的申请和释放是由程序员自己控制的,在提升灵活性的同时,我们也常常因为内存异常而头疼,相信每个c/c++程序员都遇到过内存泄露、内存溢出或着是因为使用悬垂指针而导致程序崩溃,这种问题往往不容易被找到。 普通指针容易碰到的问题 忘记释放内存,导致内存耗尽后程序崩溃。 提前释放了内存,导致其他指针变...

m0_37944991的博客 474

强大的智能指针

这个时候我们就可以用weak_ptr指针来作为一个观测者来观察shared_ptr的生命周期,他无法去改变引用计数也无法访问指针指向的对象,因为weak_ptr没有*与->符号的重载,所以说它只能充当一个观测者的角色。weak_ptr指针通常与shared_ptr指针一起使用来解决循环引用的问题,循环引用问题的起因简单来说就是一个类里面用shared_ptr指针定义了一个别的类型指针,然后用shared_ptr指针来定义该类的指针,这种情况下释放了该类的内存但该类里面定义的类的指针无法释放。

2402_82496094的博客 988

c++11新特性——智能指针

unique_ptr的定义在头文件中,它是一个模板类,可以管理任何类型的动态分配对象。其中,T是unique_ptr所管理对象的类型,Deleter是一个删除器,用于在unique_ptr销毁时释放对象。默认情况下,使用std::default_delete作为删除器。删除器是一个函数对象(可以是函数指针、函数对象或lambda表达式),它定义了当unique_ptr销毁时如何释放其所管理的资源。

qq_34434522的博客 1287

【C++】智能指针

本篇文章围绕C++中的智能指针展开讲解,包含使用智能指针的原因、内存泄漏的概念、不同版本的智能指针的原理和使用等内容

Eristic0618的博客 1424

Qt 之 智能指针汇总

来源 还有其他一些,做了一些汇总和测试,就不全列了。 文章目录: 一、垂悬指针的问题 二、Qt中的智能指针        1、QPointer        2、QSharedPointer & QWeakPointer        3、QScopedPointer      &n

一个老菜鸟的学习分享 7567
上一篇: 《Effective C++第三版》读书笔记——设计与声明
下一篇: 《Effective C++第三版》读书笔记——实现
darksun9972
博客等级 码龄19年 42粉丝 399原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值