[英]Why does a memory leak occur in this code when a bad_alloc exception is thrown for T2
如果 T2 要拋出,為什么這會導致 T1 出現 memory 泄漏?
// 在一些 header 文件中: void f( T1*, T2* );
// 在某個調用點: f( new T1, new T2 );
如果第二個對象的構造函數拋出異常,則f()
不會被調用,因此f()
中的代碼將沒有機會刪除創建的第一個 object,或存儲指向該 object 的指針供以后刪除。
同樣,在引發異常后可能執行的代碼(例如,在您可能設置為處理異常的任何catch
處理程序塊中)將無法訪問指向 object 的指針,因此它將無法刪除創建的 object 或者。
因此,在這種情況下,object 或多或少(*)不可避免地會泄漏。
(請注意,未指定首先評估哪個函數參數,因此它很容易在創建T2
后引發T1()
,從而導致T2
object 被泄露)
(*) 我想你可以做一些瘋狂的事情,比如讓T1()
和T2()
構造函數中的最后一行將它們的this
指針存儲到 static 數據結構的某個地方,但這真的很難看,並引入了許多其他的問題; 解決此問題的正確方法是使用std::unique_ptr
或類似的“捕獲”對象,以便永遠不需要顯式delete
調用,因此無論何時拋出異常都不會發生 memory 泄漏。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.