当前位置: 代码迷 >> 综合 >> shared_ptr 两种常见的使用方式 (1)
  详细解决方案

shared_ptr 两种常见的使用方式 (1)

热度:38   发布时间:2023-12-16 19:40:56.0
Roger( roger2yi@gmail.com)
1.  当作类对象的“共享句柄”来使用
2.  在类内部提供资源管理服务 —— “为类提供资源的共享拷贝语义 (或称为浅拷贝 shadow copy ,并在正确的时间回收资源”
 
上述的两种方式一种是在类外部使用,一种是在类内部使用,然而这两种方式并不是非此即彼的关系,很多情况下我们都可以选择任意一种,选择其中一种理由通常是遵循“更容易被使用,更难以被误用”的原则。
 
当作类对象的“共享句柄”来使用
 
在这种使用方式下,结合Create Method模式使用会取得更好的效果 (关于 Create Method 模式,更多信息请看“模式与重构一书”)
 
以下是一个使用场景,我们有一个类,类封装了一个底层资源的句柄和跟句柄相关的所有API调用 (句柄和 API 调用来自操作系统或者其它的 C 函数库)
 
句柄在不再被使用的时候需要被释放 (析构函数是最适合做这件事的,不是吗?);
 
句柄的拷贝可能是一种危险的行为 (通常句柄的实现都是所谓的 Opaque pointer 不透明指针,也是说该指针实际是指向一块 API 操作的数据结构,只是该数据结构是不对外公开的,这也是所谓的 C OO 风格),因为有可能导致悬挂句柄 (其实也是悬挂指针)或者由于释放的责任模糊而导致重复释放。
 
所以,我们用类封装底层资源句柄,但不为该类提供拷贝行为,而是通过外裹的share_ptr来提供共享拷贝语义。
 
下面是一个实际例子,来自我自己封装lcms库profile句柄的一个类 lcms 是一个开源用于色彩管理的 C 函数库,也是一个轻量级可用于学习 C-OO 编程的不错选择),cmsHPROFILE是lcms的profile (特性文件)资源句柄。
 
KProfile.h