1.假設有class a,new乙個a的時候,在a的建構函式中丟擲異常,那麼此次new動態申請的記憶體會自動釋放掉麼?
系統會選擇operator new 對應的operator delete來釋放記憶體,如果找不到對應的operator delete,則記憶體洩露。
(詳見effective c++ item 52)
2.預設情況下,new a的時候,如果記憶體不足,則丟擲std::bad_alloc異常。如果寫成new (std::nothrow) a,則在記憶體不足的情況下返回null,但是如果a的建構函式中又動態分配了記憶體,而此時恰好記憶體不足,我們沒有辦法強迫a的建構函式中再次使用nothrw new。沒有運用nowthrow 的必要。
3.不要在析構函式中丟擲異常(effective c++ item 08, more effectice c++ item11)
一是因為析構丟擲異常的話,被析構的物件就沒有完全被析構,不徹底。
而是因為如果同時存在兩個異常,程式將會有不確性的行為,一般是終止。
4.構造某類的物件的時候,如果基類或者成員類的建構函式丟擲異常,則這些異常必定會再次被丟擲去,不管派生類的建構函式有沒有處理這些異常,見如下**:
class t
};class bb
catch(...)
catch(...)
5.建構函式中阻止資源洩露(more effective c++ item 10)
c 構造和析構異常
c 建構函式的異常是乙個比較難纏的問題,很多時候,我們可能不去考慮這些問題,如果被問到,有人可能會說使用raii管理資源。但你真的考慮過如果建構函式失敗了,到底會發生什麼嗎,前面構造成功的成員 基類物件應該怎樣 最近在知乎上看到有人提到這個問題 看了陳碩的回答,抱著懷疑的心態寫 加以驗證。在此之前,...
在構造和析構中丟擲異常
測試驗證在類構造和析構中丟擲異常,是否會呼叫該類析構.如果在乙個類成員函式中拋異常,可以進入該類的析構函式.file classroomexamples.cpp brief x x課堂筆記的驗證 測試c 異常 在構造和析構中丟擲異常 include include include myexcepti...
構造和析構
當程式設計師呼叫create和destroy時,編譯器會自動在他們兩端插入 classcreate和 classdestroy的 真正實現構造和析構的全域性過程 classcreate和 classdestroy,create和destroy的作用是在構造後和析構前初始化和反初始化物件成員。即乙個物...