[cpp] 리소스 관리

@codemaru · March 14, 2014 · 2 min read

전통적으로 프로그래밍의 가장 복잡한 문제 중에 하나가 리소스 관리다.

— 작성하는 중인 글… 코드만 참고합시다. —

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를 활용하자. 머리가 들 아프다.

@codemaru
돌아보니 좋은 날도 있었고, 나쁜 날도 있었다. 그런 나의 모든 소소한 일상과 배움을 기록한다. 여기에 기록된 모든 내용은 한 개인의 관점이고 의견이다. 내가 속한 조직과는 1도 상관이 없다.
(C) 2001 YoungJin Shin, 0일째 운영 중