1. 程式人生 > >effective c++ 條款17:以獨立語句將newd對象置入智能指針

effective c++ 條款17:以獨立語句將newd對象置入智能指針

執行 順序 ID 條款17 隱式轉換 ive 遺失 解決 red

記住:

  • 以獨立語句將newd對象存儲於智能指針內。如果不這樣做,一旦異常被拋出,有可能導致難以察覺的資源泄漏。
int priority();
void processWidget(std::tr1::shared_ptr<Widget> pw, int priority);

//編譯錯誤,因為shared_ptr的構造函數是個explicit構造函數,無法進行隱式轉換
processWidget(new Widget, priority());

//編譯正確,但有潛在問題。
//在調用processWidget之前,編譯器必須創建代碼,做以下三件事
// 1. 調用priority()
// 2. 執行 new Widget // 3. 調用 tr1::shared_ptr構造函數 // C++編譯器完成函數參數的計算順序是不確定的,所以如果執行順序為 // 1. 執行 new Widget // 2. 調用priority() // 3. 調用 tr1::shared_ptr構造函數 // 萬一priority()調用導致異常,new Widget返回的指針會遺失,因為它尚未被置入shared_ptr內。 processWidget(std::tr1::shared_ptr<Widget>(new Widget), priority()); //解決辦法是 std::tr1::shared_ptr<Widget> pw(new
Widget); processWidget(pw, priority());

effective c++ 條款17:以獨立語句將newd對象置入智能指針