簡體   English   中英

如果在c ++中從構造函數拋出異常,如何清理初始化資源

[英]How to clean initialized resources if exception thrown from constructor in c++

前一天我在面試中遇到這個問題。 所以請指導我。

如果在c ++中從構造函數拋出異常,如何清理初始化資源?

訣竅是使用RAII (資源獲取是初始化)來管理資源。

如果你有指針成員,那么使用智能指針而不是原始指針,一旦從構造函數拋出異常,它將自動執行清理作業。

好讀:
Herb Sutter出色的GotW文章“建築失敗”

使用在銷毀資源時釋放資源的數據成員(也稱為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_errorbad_alloc ),那么已經初始化的數據成員string1被銷毀,從而釋放資源。 就此而言, string2也被銷毀,但如果構造函數拋出,則string2仍然必須為空,因此沒有特別的效果。

string是管理資源的類的示例,但還有許多其他類。 其中最靈活的被稱為“智能指針”,並且可以配置為管理幾乎任何資源,而不僅僅是像string那樣自我分配的字符數組。

拋出異常時,堆棧將展開到捕獲點。 因此,一切都是在它被建造的地方被毀壞了。

關鍵是,將每個敏感資源包裝到一個類中,析構函數負責處理相關資源。

如果資源是堆分配的對象,則智能指針就是這樣(在破壞時刪除指向的對象),如果資源是打開的文件,則流在銷毀時關閉它。 其他一切都需要自定義包裝器。

但請注意,許多“資源”由處理程序表示,它們是無效的*。 這樣就可以使用智能poitner,然后使用分配的resoure初始化並指定刪除功能。

技術發揮得更好的更多的是品味和機會。

最好的方法是:在構造函數中分配任何資源,並在析構函數中釋放任何資源。

C ++中的模板對此非常有用,因為我們可以使對象創建成為原子。

暫無
暫無

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

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