C 11 中的作用域守衛
C 11 lambda 表達式的主要優點之一在於它們能夠表達RAII 的概念(資源(資源獲取就是初始化),簡潔優雅。 RAII 的傳統實作依賴析構函數來釋放資源,但使用 lambda 表達式,可以建立一個對象,該物件將在退出其作用域時執行清理函數,無論退出是如何發生的。這稱為作用域保護。
簡單作用域保護實作
以下是C 11 中簡單作用域保護實作的範例:
templateScopeGuard 類別採用 lambda 表達式作為其建構子參數,該參數表示當作用域防護超出作用域時要執行的清理操作。 commited標誌表示清理動作是否已經執行。
用法
ScopeGuard類別可用於確保資源被正確釋放,即使發生異常。例如,下列函數取得資源並確保使用範圍保護釋放該資源:
void SomeFuncThatShouldBehaveAtomicallyInCaseOfExceptions()
{
std::vector<int> myVec;
std::vector<int> someOtherVec;
myVec.push_back(5);
//first constructor, adquire happens elsewhere
const auto& a = RAII::makeScopeGuard( [&]() { myVec.pop_back(); } );
//sintactically neater, since everything happens in a single line
const auto& b = RAII::makeScopeGuard( [&]() { someOtherVec.push_back(42); }
, [&]() { someOtherVec.pop_back(); } );
b.commit();
a.commit();
}
在此範例中,ScopeGuard 用於確保即使發生異常也能從向量中刪除元素。
結論
範圍防護是確保在 C 11 中正確釋放資源的強大工具。此處介紹的簡單實作是實現此模式的直接方法。然而,還有更複雜的實作提供附加功能,例如在範圍保護之間轉移資源所有權的能力。
免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。
Copyright© 2022 湘ICP备2022001581号-3