文章目录
- 条款 13:以对象管理资源
- 核心思想
- 智能指针简介
- 示例代码
- RAII 的应用场景
- 设计建议
- 总结
条款 13:以对象管理资源
核心思想
-
RAII 原则
资源获取即初始化(Resource Acquisition Is Initialization,RAII)是一种管理资源的设计原则:- 在对象的构造函数中获取资源。
- 在对象的析构函数中释放资源。
通过 RAII 对象,可以有效管理资源的生命周期,防止资源泄漏。
智能指针简介
-
std::auto_ptr
- 早期的智能指针实现,拷贝操作会转移所有权,使原指针指向
nullptr
。 - 缺点:拷贝语义难以理解,易导致问题,已在现代 C++ 中废弃。
- 早期的智能指针实现,拷贝操作会转移所有权,使原指针指向
-
std::tr1::shared_ptr
- 引用计数型智能指针,多个
shared_ptr
可以共享同一资源。 - 资源在最后一个
shared_ptr
被销毁时自动释放。 - 拥有直观的复制语义,通常是更好的选择。
- 引用计数型智能指针,多个
示例代码
使用 auto_ptr
管理资源
void f1() { std::auto_ptr<Investment> pInv(createInvestment()); // 自动释放资源,调用 pInv 的析构函数 }
使用 shared_ptr
管理资源
void f2() { std::tr1::shared_ptr<Investment> pInv(createInvestment()); // 自动释放资源,调用 shared_ptr 的析构函数 }
RAII 的应用场景
-
动态内存管理
- 动态分配的内存需要通过 RAII 对象管理,避免忘记释放或出现重复释放。
-
文件操作
- 文件打开后需要关闭,可通过 RAII 对象在析构时自动关闭文件。
-
网络资源
- 网络连接或套接字可通过 RAII 确保连接被正确关闭。
设计建议
-
优先使用现代智能指针
std::unique_ptr
:替代std::auto_ptr
,提供独占所有权。std::shared_ptr
:替代std::tr1::shared_ptr
,支持引用计数管理。
-
尽量减少裸指针的使用
- 使用 RAII 管理资源而不是手动分配和释放。
-
遵循 RAII 原则
- 确保资源在超出作用域时被正确释放。
总结
- RAII 是资源管理的核心思想,构造函数中获取资源,析构函数中释放资源。
- 使用智能指针如
std::shared_ptr
或std::unique_ptr
来管理动态内存。 - 遵循现代 C++ 的最佳实践,优先使用标准库提供的 RAII 工具。