這是《Effective C++》中第17個原則,作者以一個示例形象地說明了這一點。
有一個資源處理函數A,這個函數中接收兩個參數,它們分別是shared_ptr類型的指針和一個整形參數。但是,因為用對象來管理資源的原則,所以在這里首先有了一個資源管理類的對象,并且想把它作為A的第一個參數傳進去,而A的第二個參數用一個能返回整形參數的成員函數B作為實參傳進來。程序員為了圖省事,他直接在A的第一個參數的位置上new了一個對象C,這個對象當然就是資源管理類的類型了,但是A接受的是智能指針類型,所以他還在此基礎上進行強制類型轉換到智能指針類型。
這里還要介紹一個機制,那就是編譯器在產生函數調用碼之前,首先要對實參進行核算。那么在核算期間,上述內容就可以分成3步:1、new 對象C;2、調用B;3、強制把C轉換成shared_ptr類型。
在上述三個步驟中,1和3的順序是確定的,那就是1在先3在后。但是2卻不一定了,這是根據語言和編譯器的不同而異的,所以它們的順序可能是213、123、132。但是在123的情況下,如果調用B的過程發生了異常,導致程序終止,而new C返回的指針會丟失。又因為shared_ptr是用來防止資源泄露的,那么我們的目的沒有達到,new出來的C還是泄露了。
所以作者在此原則中想著重強調的是,你最好不要在調用函數的過程中直接在參數列表里面進行new啊,類型轉換之類的操作,一旦發生資源泄露難以察覺,所以你最好把這些都放在函數調用之前的單獨語句里面。
原則17:以獨立語句將newed對象置入智能指針
最后編輯于 :
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
- 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
- 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
- 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...