本篇笔记包含 Term 13~17。
Term 13:以对象管理资源
编写 C++ 程序容易遇到的一个问题就是内存泄漏,手动 delete
容易遇到各种问题。一个较好的解决方案是使用类来管理资源,通过析构过程保证资源的正确释放。
- 使用 RAII 对象,在其构造函数中获取资源,析构函数中释放资源
- 常用的 RAII 对象,智能指针,shared_ptr 和 unique_ptr
Term 14:在资源管理类中小心 copying 行为
可选的策略有:
- 禁止复制
- 引用计数
- 深拷贝
- 转移所有权(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());