effective c++ 條款17:以獨立語句將newd對象置入智能指針
阿新 • • 發佈:2018-06-23
執行 順序 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(newWidget); processWidget(pw, priority());
effective c++ 條款17:以獨立語句將newd對象置入智能指針