Effective C++ 條款17:以獨立語句將newd的物件放進智慧指標
阿新 • • 發佈:2018-11-24
以獨立語句將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的呼叫”是分隔開來的,
位於不同語句內,所以編譯器不得在它們之間任意選擇執行次序。
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的呼叫”是分隔開來的,
位於不同語句內,所以編譯器不得在它們之間任意選擇執行次序。