scopeguard的作用是確保資源面對異常時總能被成功釋放,就算沒有正常返回。慣用法讓我們在建構函式裡獲取資源,當因為異常或者正常作用域結束,那麼在析構函式裡釋放資源。總是能釋放資源。如果沒有異常丟擲則正常結束,只是有異常發生或者沒有正常退出時釋放資源。關於scopegaurd的概念想多了解一點的童鞋點這裡和這裡。c#中的scopeguard比較簡單,通過using初始化或者通過finally就可以做到,c++中需要自己去實現。
c++中設計scopeguard的關鍵技術:通過區域性變數析構函式來管理資源,根據是否是正常退出來確定是否需要清理資源。用c++11做很簡單。
template class//templatescopeguard
explicit scopeguard(const f& f) : m_func(f), m_dismiss(false
){} ~scopeguard()
scopeguard(scopeguard &&rhs) : m_func(std::move(rhs.m_func)), m_dismiss(rhs.m_dismiss)
void
dismiss()
private
: f m_func;
bool
m_dismiss;
scopeguard();
scopeguard(
const scopeguard&);
scopeguard& operator=(const scopeguard&);
//auto run(args&&... args)->typename std::result_of::type
//
};template
scopeguard::type> makeguard(f && f)
測試**:
voidtestscopeguard()
;
//正常退出
//異常退出
//非正常退出
}
通過測試程式可以知道,當程式沒有發生異常正常退出時,需要呼叫一下dismiss函式,以解除scopeguard,當程式異常退出時,會進入異常處理函式去釋放相應資源,實現scopeguard的目的。
C11簡潔之道 tupe元祖
tuple元組是乙個固定大小不同型別的值的集合,是泛化的std pair。我們也可以把它當作乙個通用的結構體來使用,不需要建立結構體有獲取結構體特徵,在某些情況可以取代結構體,使程式更簡潔 直觀。tuple在c 11中使用簡單,但是往往要和模板元的一些技巧結合使用。tuplechar int tp ...
C11簡潔之道 迴圈的改善
在c 98 03中,通過for迴圈對乙個容器進行遍歷,一般有兩種方法,常規的for迴圈,或者使用中的for each方法。for迴圈遍歷 void func void for each方法 void vfunccall int n void func2 void for each相比一般的for迴圈...
排序演算法 C 11的實現
近來在學習 這算是自娛自樂吧 這裡只考慮排序的物件的有move建構函式,move賦值函式。cpp view plain copy ifndef yyrsort h define yyrsort h include using namespace std const size t threshold ...