2009. 7. 10. 04:11

리소스 누수를 피하는 방법 : auto_ptr<>

아래 예를 살펴보자.

void processAdoption(istream & dataSource)

{

        while(dataSource) {

               ALA * pa = readALA(dataSource);

               pa->processAdoption();

               delete pa;

        }

}


만약 pa->processAdaoption(); 에서 예외가 발생한다면 어떤 일이 일어날까?

pa 가 삭제되지 않아 메모리 누수가 생길 것이다. 메모리 릭을 방지하기 위해 다음과 같이 작성할 수 있다.

void processAdoption(istream & dataSource)

{

        while(dataSource) {

               ALA * pa = readALA(dataSource);

 

               try {

                       pa->processAdoption();

               } catch(...) {

                       delete pa;

                       throw;   // 예외를다시caller 에게전파

               }

 

               delete pa;

        }

}


위 코드는 try - catch 블록으로 코드가 복잡하고, delete 문을 두번 작성해야 한다.

위 코드는 아래처럼 auto_ptr 을 이용하면 코드를 깔금하게 만들 수 있다.

void processAdoption(istream & dataSource)

{

        while(dataSource) {

               auto_ptr<ALA> pa = readALA(dataSource);

               pa->processAdoption();

        }

}


위에서 pa 는 지역객체이므로 pa->processAdoption() 에서 예외가 발생하더라도 함수 종료시 auto_ptr 의 소멸자가 호출되어 pa 에 할당된 메모리가 삭제된다.

이처럼 지역 리소스를 조작할 때 쓰이는 포인터는 auto_ptr 을 사용하자.

만약 여기까지 읽다보면 이런 의문이 들 수 있다. 혹, 생성자 또는 소멸자에서 예외가 발생하면 어떻게 될까?
생성자와 소멸자 작성시 반드시 생성자에서는 리소스 누수가 일어나지 않게 하고, 소멸자에서는 예외가 탈출 못하도록 코드를 작성해야 한다.

참고 : More Effective C++