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

        条款13导入这样的概念:“资源取得时机便是初始化时机”(Resource Acquisition Is Initialization;RAII),并以此作为“资源管理类”的脊柱,也描述了auto_ptr和tr1::shared_ptr如何将这个观念表现在heap-based资源上。然而并非所有资源都是heap-based,对那种资源而言,像auto_ptr和tr1::shared_ptr这样的智能指针旺旺不适合作为资源掌管者。既然如此,有可能偶尔你会发现,你需要建立自己的资源管理类。

        有时候我们复制对象时可能有其它需求,比如给对象加锁。在对象的构造函数中加锁,然后在析构函数中解锁,如果该对象被复制时如果选择引用计数加一,那么当删除对象时则不仅仅是回收对象了,还需要额外的解锁操作,tr1::shared_ptr允许指定“删除器(deleter)”,那是一个函数或函数对象,当引用计数为零时便被调用(此机能并不存于auto_ptr——它总是将其指针删除)。

        有时候我们也可以拒绝复制,这样的话可参考条款6,采用private声明即可。

        Coping函数(包括copy构造函数和copy assignment操作符)有可能被编译器自动创建出来,因此除非编译器所生版本做了你想要做的事(条款5提过其缺省行为),否则你得自己编写它们。某些情况下或许也想支持这些函数的一般版本,这样的版本描述与条款45.

请记住

  • 复制RAII对象必须一并复制它所管理的资源,所以资源的copying行为决定RAII对象的copying行为。

  • 普遍而常见的RAII class copying行为是:抑制copying、施行引用计数法(reference counting)。不过其他行为也都可能被实现。

发布了88 篇原创文章 · 获赞 17 · 访问量 7万+

猜你喜欢

转载自blog.csdn.net/yj_android_develop/article/details/103327865