14 Mar
2014
Posted in: 코드
By    No Comments

[플밍노트] 리소스 관리


[플밍노트] 리소스 관리
by 신영진(YoungJin Shin), codewiz at gmail.com, @codemaru, http://www.jiniya.net

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

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

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

Browser does not supports flash movie

  • 트랙백 주소: http://www.jiniya.net/wp/archives/12805/trackback

관련 글