2009.10.23 20:38 연구실/Boost.org

이번 boost 포스팅은 boost의 1.38.0 버전 부터 추가가 된 scope exit 입니다. 라이브러리 이름에서 오는 포스에서 알 수 있듯이, "유효 범위"와 관련 있는 라이브러리 입니다.

http://www.boost.org/doc/libs/1_40_0/libs/scope_exit/doc/html/index.html

에서 확인 가능합니다만, 시간이 지나서 링크가 깨질수 있으니. boost.org 에 직접 들어 가봐서 보는게 좋을듯 싶네요.

scope exit 란 무엇인가?

 "{ }" 를 벗어 날 경우, { } 안에 있는 변수들의 경우, 스택 되감기에 의하여, 지워 집니다. 이때 C++에서의 객체라면, 소멸자를 호출해주는데, 문제는 동적메모리 할당된 개체의 경우라든지, 뮤텍스라든지, 파일 핸들, 리소스 핸들 같은 것들은 별도로 소멸과정을 정의해 주어야만, 정상적으로 후처리를 합니다.

만약 개발된 라이브러가 뒷처리를 프로그래머에게 맡겼다면, 프로그래머는 기억해 두었다가, 반드시 후처리를 해 줘야 합니다.( new, delete 가 대표적 )

이때 이 후처리를 손쉽게 할 수 있게 도와 주는 라이브러리 라고 보면 되겠습니다.

어떻게 사용 하는가?

우선 #include <boost/scope_exit.hpp> 를 해야 합니다. 그리고 BOOST_SCOPE_EXIT 메크로와 BOOST_SCOPE_EXIT_END 를 이용하여 뒷처리를 하고 싶은 대상과, 하고 싶은 일을 결정할 수 있습니다.

말 보다 코드겠죠?

직감이 좋으신분은 이것 하나만으로 다 파악 하셨을 것입니다. BOOST_SCOPE_EXIT 를 사용한 뒤에 반드시 바로 BOOST_SCOPE_EXIT_END를 써 주어야 하는 것만 기억 하시면 됩니다.


그렇다면 어디에 사용 되는가?

boost
   scope exit
      alternative

에 보시면 사용하면 좋을 법한 예제를 보여 주고 있습니다. 그 중 가장 이해가 잘 되는 코드 하나를 발췌하여, 설명하겠습니다.

보시는것과 같이 해당 코드는 다음의 특징을 가지고 있습니다.

  • File 오브젝트는 try ~ catch 블록 외부에 선언해 둘 수 밖에 없습니다. 왜냐하면 catch 영역에서도 사용 할 수도 있기 때문입니다.
  • File 오브젝트 생성 후에 try 블록에서 작업을 하다 close() 를 호출해 주는데, 문제는 예외가 발생할 경우 catch() 에서도 확인하여 close() 를 해 줄수 밖에 없습니다. 왜냐하면, 언제 예외가 발생했는지 알 수 없기 때문입니다.

이러한 문제점을 갖고 있는 File 오브젝트를 사용하다 보면, 재정의를 하거나, 포장을 하여 사용하게 되는데, 이럴때 기존의 소스코드를 수정하거나, 추가로 소스를 만들지 않아도, 충분히 scope exit 를 활용 하여, 멋지게 사용 할 수 있습니다.

다음의 코드는 scope exit 를 사용하여 수정한 내용입니다.

간편하지요?

저작자 표시
신고
posted by 농사를 짓는 게임 프로그래머 최익필

댓글을 달아 주세요