zoukankan      html  css  js  c++  java
  • 条款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,等号左边指向原本的资源。

  • 相关阅读:
    题解 CF171G 【Mysterious numbers
    题解 P1157 【组合的输出】
    题解 P3955 【图书管理员】
    题解 P2036 【Perket】
    题解 CF837A 【Text Volume】
    题解 CF791A 【Bear and Big Brother】
    题解 CF747A 【Display Size】
    题解 P1332 【血色先锋队】
    题解 P2660 【zzc 种田】
    题解 P4470 【[BJWC2018]售票】
  • 原文地址:https://www.cnblogs.com/lasnitch/p/12764182.html
Copyright © 2011-2022 走看看