文章目录
- 条款 17:以独立语句将 `newed` 对象置入智能指针
- 核心思想
- 示例代码
- 错误用法分析
- 推荐设计
- 总结
条款 17:以独立语句将 newed
对象置入智能指针
核心思想
-
问题背景
如果在将newed
对象传递给智能指针时,包含了复杂的表达式,一旦其中某部分抛出异常,newed
对象可能无法被智能指针管理,从而造成资源泄漏。 -
解决方案
以独立语句将newed
对象存储到智能指针中,以确保资源能够安全、可靠地管理。
示例代码
// 正确用法:将 newed 对象存入智能指针的操作单独为一行 std::tr1::shared_ptr<Widget> pw(new Widget); // 创建并存储 Widget processWidget(pw, priority()); // 调用其他函数
错误用法分析
processWidget(std::tr1::shared_ptr<Widget>(new Widget), priority());
- 潜在问题
- 如果
priority()
函数抛出异常,那么new Widget
创建的对象就没有机会被std::tr1::shared_ptr
管理。 - 这会导致资源泄漏。
- 如果
推荐设计
-
分离操作
始终将动态分配的对象与智能指针绑定的操作放在单独的语句中。示例
auto pw = std::make_shared<Widget>(); // 创建并管理对象,避免直接调用 new processWidget(pw, priority()); // 安全调用其他函数
-
使用工厂函数
通过std::make_shared
或std::make_unique
等工具函数创建智能指针,它们会在内部完成new
和对象的绑定,避免手动操作。 -
防止异常泄漏
独立语句能够确保资源在任何异常情境下都受到智能指针的管理,从而防止泄漏。
总结
- 在任何情况下,都应以独立语句将动态分配的对象存入智能指针。
- 更推荐使用现代 C++ 中的
std::make_shared
或std::make_unique
,进一步简化资源管理并减少错误风险。