전통적으로 프로그래밍의 가장 복잡한 문제 중에 하나가 리소스 관리다.
— 작성하는 중인 글… 코드만 참고합시다. —
xstatus some_func()
{
xstatus s;
xhandle resourcea;
xhandle resourceb;
resourcea = CreateResourceA();
if(!resourcea)
goto $cleanup;
resourceb = CreateResourceB();
if(!resourceb)
goto $cleanup;
s = SUCCESS;
$cleanup:
if(resourcea)
FreeResourceA();
if(resourceb)
FreeResourceB();
return s;
}
이 구조의 가장 핵심은 변수들의 초기화다. 위 코드는 모든 변수가 정상적으로 초기화 되지 않았기 때문에 if(!resourcea)나 if(!resourceb)에 걸리면 의도하지 않은 결과가 나올 수 있다. 상기 패턴으로 코드를 만들 때 가장 신경써야 하는 부분은 아래와 같이 변수를 정상적으로 초기화 시켜 주는 것이다.
xstatus some_func()
{
xstatus s = FAIL;
xhandle resourcea = NULL;
xhandle resourceb = NULL;
for(int i=0; i<size; ++i)
{
xhandle resourcea = CreateResourceA();
if(!resourcea)
break;
xhandle resourceb = CreateResourceB();
if(!resourceb)
break;
// processing...
FreeResourceA();
FreeResourceB();
}
초보 프로그래머들이 많이 하는 루프 내 리소스 관리 실수. break에 걸리는 순간 이전에 획득한 리소스가 정상적으로 해제되지 않는다. if(!resourceb) 구문을 타는 순간이다.
C++의 RAII를 활용하자. 머리가 들 아프다.