第5章

  1. 内存是最常见的资源,但对象都可以成为资源。程序所操作的虚拟或物理量都是资源。
  2. 资源不应丢失(泄漏)。如果通过句柄(如指针或ID)访问资源,则该句柄不应悬空(指向不存在的资源)。资源应在不再需要时,以与其获取方式相对应的方式释放。
  3. 资源获取即初始化(RAII)是一种惯用法;是C++资源管理的主导方法,其中每个资源都由一个对象拥有,在构造函数中获取,在该对象的析构函数中释放。
  4. RAII对象应始终在栈上或作为另一个对象的数据成员创建。当程序流程离开包含RAII对象的作用域,或包含RAII对象的更大对象删除时,RAII对象的析构函数将执行。无论控制流以何种方式离开作用域,这都会发生。
  5. 如果每个资源都由RAII对象拥有,并且RAII对象不提供原始句柄(或用户小心不复制原始句柄),则句柄只能从RAII对象获得,并且只要该对象存在,资源就不会释放。
  6. 最常用的是std::unique_ptr用于内存管理,std::lock_guard用于管理互斥锁。
  7. 通常,RAII对象不可复制。移动RAII对象会转移资源的所有权;经典RAII模式不支持此操作,大多数RAII对象应不可移动(区分std::unique_ptr和const std::unique_ptr)。
  8. RAII难以处理释放失败,异常无法从析构函数中传播,无法很好地向调用者报告失败,所以释放资源失败通常会导致未定义行为(C++标准有时也采用这种方法)。