簡體   English   中英

為什么當 T2 拋出 bad_alloc 異常時,此代碼中會出現 memory 泄漏

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM