簡體   English   中英

內存釋放和異常

[英]Memory deallocation and exceptions

我有一個關於內存釋放和異常的問題。 當我使用delete刪除在堆上創建的對象時。 如果在此刪除之前發生異常,則內存將泄漏或此刪除將執行?

在您描述的情況下,內存將會泄漏。

避免這個問題的兩個技巧:

  • 使用智能指針,不會遇到同樣的問題(首選解決方案)
    - >在堆棧上構造智能指針,因此無論如何調用其析構函數,並在析構函數中提供刪除指向的內容

  • 使用try / catch語句,並刪除catch語句中的項目

這取決於delete位置。 如果它位於捕獲異常的catch中,則可能會調用它。

try {
    f();  // throws
} catch( ... ) {
    delete p;  // will delete
}

如果它在捕獲異常的catch之后並且catch沒有從函數返回(即允許執行流程在catch塊之后繼續),那么可能會調用delete

try {
    f();  // throws
} catch( ... ) {
    // execution proceeds beyond catch
}
delete p;  // will delete

如果delete不在catch塊中或者在允許執行繼續的catch塊之后,則delete將不會調用。

try {
    f();  // throws
    delete p;  // will not delete
}  // ...

正如你可以想像,在兩個第一例以上的delete也不會,如果有前一拋調用delete

try {
    f();  // throws
} catch( ... ) {
    g();  // throws
    delete p;  // will not delete
}

它不會被調用。 這就是為什么鼓勵你看RAII的原因。 Stroustrup

我們還必須確保“異常”真正意味着可以通過try / catch捕獲的C ++異常。 在C ++ try / catch無法捕獲的系統中還有其他例外(例如除以0)。

在這種情況下(超出C ++標准的范圍),除非捕獲這些異常並且處理程序明確地適當地調用“delete”,否則不會執行“delete”。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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