C 對「finally」區塊和 RAII 慣用法的支援
與普遍看法相反,C 不支援「finally」區塊。相反,它採用了一個稱為 RAII(資源獲取即初始化)的基本概念。
RAII 習慣用法
RAII 封裝了應該在物件期間獲取資源的想法初始化並在其析構函數中釋放。當物件超出範圍時,會自動呼叫其析構函數,即使存在異常也能確保資源清理。這消除了對顯式「finally」區塊的需要。
範例如下所示:
class lock { mutex& m_; public: lock(mutex& m) : m_(m) { m.acquire(); } ~lock() { m_.release(); } }; class foo { mutex mutex_; public: void bar() { lock scopeLock(mutex_); // Lock object foobar(); // May throw an exception // scopeLock will be destructed and release the mutex, regardless of an exception } };
此外,RAII 簡化了資源的類別管理。當成員物件管理資源時,所屬類別可以最大限度地減少其析構函數的責任,並依靠其成員物件的析構函數來釋放資源。
RAII 與 C# 的 'using' 語句
與 RAII 類似,C# 的 'using' 語句確保資源的確定性銷毀。然而,RAII 的不同之處在於將資源管理擴展到所有資源類型,包括記憶體。相較之下,.NET 中的「using」語句確定性地釋放記憶體以外的資源,記憶體是在垃圾收集週期期間處理的。
以上是C 是否有「finally」區塊?的詳細內容。更多資訊請關注PHP中文網其他相關文章!