C 11의 스코프 가드
C 11 람다 표현식의 주요 장점 중 하나는 RAII( 리소스 획득은 초기화입니다)를 간결하고 우아한 방식으로 구현합니다. RAII의 기존 구현은 소멸자를 사용하여 리소스를 해제하지만 람다 식을 사용하면 종료 발생 방식에 관계없이 해당 범위를 종료할 때 정리 기능을 실행하는 개체를 만드는 것이 가능합니다. 이를 스코프 가드라고 합니다.
간단한 스코프 가드 구현
다음은 C 11에서 간단한 스코프 가드 구현의 예입니다.
<code class="c++">template< typename Lambda > class ScopeGuard { mutable bool committed; Lambda rollbackLambda; public: ScopeGuard( const Lambda& _l) : committed(false) , rollbackLambda(_l) {} template< typename AdquireLambda > ScopeGuard( const AdquireLambda& _al , const Lambda& _l) : committed(false) , rollbackLambda(_l) { _al(); } ~ScopeGuard() { if (!committed) rollbackLambda(); } inline void commit() const { committed = true; } };</code>
ScopeGuard 클래스는 스코프 가드가 범위를 벗어날 때 실행될 정리 작업을 나타내는 생성자 인수로 람다 식을 사용합니다. 커밋된 플래그는 정리 작업이 실행되었는지 여부를 나타냅니다.
사용
ScopeGuard 클래스를 사용하면 예외가 발생하더라도 리소스가 올바르게 해제되도록 할 수 있습니다. . 예를 들어, 다음 함수는 리소스를 획득하고 스코프 가드를 사용하여 리소스가 해제되도록 합니다.
<code class="c++">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(); }</code>
이 예에서는 ScopeGuard를 사용하여 다음과 같은 경우에도 요소가 벡터에서 제거되도록 합니다. 예외가 발생합니다.
결론
스코프 가드는 C 11에서 리소스가 올바르게 릴리스되도록 하는 강력한 도구입니다. 여기에 제시된 간단한 구현은 구현하는 간단한 방법입니다. 이 패턴. 그러나 범위 가드 간에 리소스 소유권을 이전하는 기능과 같은 추가 기능을 제공하는 더 복잡한 구현이 있습니다.
위 내용은 C 11 람다 표현식을 사용하여 스코프 가드를 구현하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!