RAII : 자원 획득 초기화

Download c++ eBook

비고

RAII는 cquisition에게 I의 I의 nitialization을 esource R을 의미합니다. 때때로 SBRM (Scope-Based Resource Management) 또는 RRID (Resource Release Is Destruction)라고도하는 RAII는 리소스를 개체 수명에 연결하는 데 사용되는 관용구입니다. C ++에서 객체의 소멸자는 객체가 범위를 벗어날 때 항상 실행됩니다. 따라서 객체 정리에 리소스 정리를 묶을 수 있습니다.

최종적으로 해제해야하는 리소스 (예 : 잠금, 파일 핸들, 할당 된 버퍼)를 확보해야 할 때마다 개체를 사용하여 리소스 관리를 처리하는 것이 좋습니다. 스택 unwinding은 예외 또는 초기 스코프 종료에 관계없이 발생하므로 리소스 핸들러 객체는 가능한 모든 현재 및 미래 코드 경로를 신중하게 고려하지 않고 리소스를 정리합니다.

RAII가 자원의 수명에 대해 생각하는 개발자를 완전히 자유롭게하지는 않는다는 점은 주목할 가치가 있습니다. 한 가지 경우는 소멸자가 호출되지 않도록하는 crash 또는 exit () 호출입니다. OS는 프로세스가 끝난 후 메모리와 같은 프로세스 로컬 리소스를 정리하기 때문에 대부분의 경우 문제가되지 않습니다. 그러나 시스템 리소스 (즉, 명명 된 파이프, 잠금 파일, 공유 메모리)를 사용하면 프로세스가 자체적으로 정리하지 않은 경우 (즉, 잠금 파일이있는 경우 시작 테스트시)를 처리 할 수있는 기능이 여전히 필요합니다. pid가있는 프로세스가 실제로 존재하는지 확인한 다음 그에 따라 작동하십시오.

또 다른 상황은 유닉스 프로세스가 exec-family로부터 함수를 호출 할 때, 즉 fork-exec 후에 새로운 프로세스를 생성하는 경우이다. 여기서 자식 프로세스는 부모 메모리 (RAII 객체 포함)의 전체 사본을 가지지 만 exec가 호출되면 해당 프로세스에서 소멸자가 호출되지 않습니다. 반면에 프로세스가 분기되고 프로세스가 exec를 호출하지 않으면 두 프로세스 모두에서 모든 리소스가 정리됩니다. 이는 포크에서 실제로 복제 된 모든 자원에 대해서만 올바르지 만 시스템 자원과 함께 두 프로세스는 자원 (예 : 잠금 파일의 경로)에 대한 참조 만 가지며 개별적으로 해제하려고 시도하며 잠재적으로 다른 프로세스가 실패합니다.

관련 예

Stats

681 Contributors: 10
Tuesday, November 1, 2016
아래 라이선스: CC-BY-SA

와 제휴하지 않음 Stack Overflow
Rip Tutorial: info@zzzprojects.com

eBook 다운로드