1. 程式人生 > >Effective C++ 條款17:以獨立語句將newd的物件放進智慧指標

Effective C++ 條款17:以獨立語句將newd的物件放進智慧指標

以獨立語句將new出來的物件儲存於智慧指標內。如果不這樣做,一旦異常被丟擲,有可能導致難以察覺的資源洩露

  processWidget(shared_ptr<Widget> (new Widget),priority());
  執行分兩部分:
  1.new Widget;
  2.呼叫shared_ptr的建構函式
  3.呼叫priority()
  但是由於C++語言的取引數的次序彈性大,無法總是以特定次序進行,
  所以當出現
   1.new Widget;
   2.呼叫priority;
   3.呼叫shared_ptr的建構函式
   如果呼叫priority失敗丟擲異常
   則new出來的資源將會無物件支配導致資源洩露。
   所以一個良好的解決方法是:
   shared_ptr<Widget> pw(new Widget);在單獨語句內以智慧指標儲存new來的物件
   processWidget(pw,priority);這樣才不會導致資源洩露


   補充:之所以這樣行得通,因為編譯器對於“跨越語句的各項操作”沒有重新排列的自由
   (只有在語句內它才有那樣的自由度)。在上述修訂後的程式碼內,“new Widget”表示式以及
   對“對shared_ptr建構函式的呼叫”這兩個動作,和“對priority的呼叫”是分隔開來的,
   位於不同語句內,所以編譯器不得在它們之間任意選擇執行次序。