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