条款14:在资源管理类中小心copying行为

1、为什么需要自定义资源管理类?

条款13里讲了两种智能指针对象,它们都是用于管理动态内存的。然而,它们并不适用于管理别的资源,比如说互斥器。因此,有些时候我们需要自定义自己的资源管理类。

2、自定义资源管理类需要考虑的一个问题:copying 问题

copying包括:copy 构造函数、copy赋值符号函数。在自定义资源管理类时,结合不同的问题(不同场景),处理copying 函数可能采取下述方案

(1)禁止复制

有些资源管理对象的copying是不合理的,或者说是没意义的。比如:互斥器。
禁止复制的具体做法:将copying函数声明为private的。(条款6)

(2)采用类似于trl::shared_ptr 的引用计数法

这里的机制类似于trl::shared_ptr ,即直到指向同一对象的最后一个智能指针对象被销毁时前,才释放资源。
具体做法:内含一个成员变量,当其为0时,进行释放资源。然而不同的资源,释放资源的具体操作可能是不同的。例如,资源是内存的话,就应该是回收内存。而资源是互斥器的话,释放资源就应该是解除锁定。

trl::shared_ptr智能指针,在缺省参数情况下,便是回收内存。但是,它也可以指定别的释放资源的操作(被称为"删除器"),删除器可以是一个函数,也可以是一个函数对象当需要它时,它可以作为trl::shared_ptr智能指针的第二个参数传递过去。

(3)复制底部资源

即,需要做到深拷贝。只要保证副本时,资源被回收即可。

(4)转移底部资源拥有权

类似于auto_ptr,即在执行copying操作时,使得等号右边指向null,等号左边指向原本的资源。

posted @ 2019-12-28 22:31  江南又一春  阅读(112)  评论(0编辑  收藏  举报