本篇笔记包含 Term 13~17。

Term 13:以对象管理资源

编写 C++ 程序容易遇到的一个问题就是内存泄漏,手动 delete 容易遇到各种问题。一个较好的解决方案是使用类来管理资源,通过析构过程保证资源的正确释放。

  1. 使用 RAII 对象,在其构造函数中获取资源,析构函数中释放资源
  2. 常用的 RAII 对象,智能指针,shared_ptr 和 unique_ptr

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

可选的策略有:

  1. 禁止复制
  2. 引用计数
  3. 深拷贝
  4. 转移所有权(auto_ptr 那样的行为)

Term 15:在资源管理类中提供对原始资源的访问

RAII class 应当提供一个直接获取到原始资源(指针/引用)的方法。一般来说,显示转换比较安全,隐式转换比较方便。

Term 16:成对使用 new 和 delete 时要采取相同形式

如果在 new 时使用了 [],那么在 delete 时也应使用 [],未使用 [] 时同样要准寻这个原则,以避免释放资源出错。

Term 17:以独立语句将 newed 对象置入智能指针

要以独立语句将 newed 对象置入智能指针,否则可能发生难以察觉的资源泄漏

// 首先有以下定义
int priority();
void processWidget(std::tr1::shared_ptr<Widget> pw, int priority);
// 几种调用
processWidget(new Widget, priority());    // 出错,shared_ptr 无法隐式转换
processWidget(std::tr1::shared_ptr<Widget> (new Widget), priority());    // 虽然可以通过编译,但是假如 priority() 先于 shared_ptr 的构造函数执行且出现异常,则资源泄漏
// 下面时正确做法
std::tr1::shared_ptr<Widget> pw(new Widget);
processWidget(pw, priority());