您好,登錄后才能下訂單哦!
這篇文章主要介紹“C++為什么類請求的所有資源必須在析構函數釋放”,在日常操作中,相信很多人在C++為什么類請求的所有資源必須在析構函數釋放問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”C++為什么類請求的所有資源必須在析構函數釋放”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!
類申請的所有資源必須在析構函數釋放
避免資源泄露,特別是在發生錯誤的情況下。
如果資源表現為實現了全套默認操作的類,這些會自動發生。
class X { ifstream f; // may own a file // ... no default operations defined or =deleted ...};
X類的ifstream成員通過析構函數隱式關閉任何它打開的任何文件。
class X2 { // bad FILE* f; // may own a file // ... no default operations defined or =deleted ...};
X2 may leak a file handle.
X2存在泄露文件句柄的可能性。(具體講通常是漏掉關閉文件,譯者注)
sokcet(通信,譯者注)沒有被關閉會怎么樣?首先,析構函數,關閉或清除操作永遠不應該失敗。如果它確實會失敗,這問題還沒有真正好的解決方案。對于(通信,譯者注)起始模塊,析構函數的作者并不知道析構函數因為什么被調用,而且沒有辦法通過拋出異常來“拒絕處理”。更為嚴重的是,許多“關閉/釋放”操作都無法重試。為了解決這個問題有過許多嘗試,不是沒有找到通用的解決方案。如果可能,可以將關閉或清除的失敗看作根本性錯誤并終止。
類可以持有指向那些它并不擁有所有權的對象的指針或引用。顯然,這樣的對象不應該被該類的析構函數銷毀。例如:
Preprocessor pp { /* ... */ };Parser p { pp, /* ... */ };Type_checker tc { p, /* ... */ };
這里p指向了pp但是并不擁有pp。
Enforcement(實施建議)
(Simple) If a class has pointer or reference member variables that are owners (e.g., deemed owners by using gsl::owner), then they should be referenced in its destructor.
(簡單)如果類包含具有所有權(例如通過gsl::owner宣示所有權)的指針或引用成員,則它們應該在析構函數中被引用。
譯者注:個人覺得應該是在析構函數中釋放。
(Hard) Determine if pointer or reference member variables are owners when there is no explicit statement of ownership (e.g., look into the constructors).
(困難)在指針或引用類型的成員變量沒有明確陳述所有權時判斷它們是否是所有者(例如通過走查構造函數等方式)。
到此,關于“C++為什么類請求的所有資源必須在析構函數釋放”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。