文章目錄
- 條款 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
,進一步簡化資源管理并減少錯誤風險。