[英]How to clean initialized resources if exception thrown from constructor in c++
前一天我在面試中遇到這個問題。 所以請指導我。
如果在c ++中從構造函數拋出異常,如何清理初始化資源?
訣竅是使用RAII (資源獲取是初始化)來管理資源。
如果你有指針成員,那么使用智能指針而不是原始指針,一旦從構造函數拋出異常,它將自動執行清理作業。
使用在銷毀資源時釋放資源的數據成員(也稱為RAII)。
例如:
struct TwoStrings {
std::string string1;
std::string string2;
TwoStrings(const std::string &input) : string1(input) {
if (!input[1] == ':') {
throw std::logic_error('not a Windows absolute path');
// yes, absolute paths can begin \\, this is a toy example
}
if (input.back() == '\\') {
string2 = input;
} else {
string2 = input + "\\";
}
}
};
如果構造函數拋出( logic_error
或bad_alloc
),那么已經初始化的數據成員string1
被銷毀,從而釋放資源。 就此而言, string2
也被銷毀,但如果構造函數拋出,則string2
仍然必須為空,因此沒有特別的效果。
string
是管理資源的類的示例,但還有許多其他類。 其中最靈活的被稱為“智能指針”,並且可以配置為管理幾乎任何資源,而不僅僅是像string
那樣自我分配的字符數組。
拋出異常時,堆棧將展開到捕獲點。 因此,一切都是在它被建造的地方被毀壞了。
關鍵是,將每個敏感資源包裝到一個類中,析構函數負責處理相關資源。
如果資源是堆分配的對象,則智能指針就是這樣(在破壞時刪除指向的對象),如果資源是打開的文件,則流在銷毀時關閉它。 其他一切都需要自定義包裝器。
但請注意,許多“資源”由處理程序表示,它們是無效的*。 這樣就可以使用智能poitner,然后使用分配的resoure初始化並指定刪除功能。
技術發揮得更好的更多的是品味和機會。
最好的方法是:在構造函數中分配任何資源,並在析構函數中釋放任何資源。
C ++中的模板對此非常有用,因為我們可以使對象創建成為原子。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.