3. Implementation/C / C++
리소스 누수를 피하는 방법 : auto_ptr<>
SSKK
2009. 7. 10. 04:11
아래 예를 살펴보자.
만약 pa->processAdaoption(); 에서 예외가 발생한다면 어떤 일이 일어날까?
pa 가 삭제되지 않아 메모리 누수가 생길 것이다. 메모리 릭을 방지하기 위해 다음과 같이 작성할 수 있다.
위 코드는 try - catch 블록으로 코드가 복잡하고, delete 문을 두번 작성해야 한다.
위 코드는 아래처럼 auto_ptr 을 이용하면 코드를 깔금하게 만들 수 있다.
위에서 pa 는 지역객체이므로 pa->processAdoption() 에서 예외가 발생하더라도 함수 종료시 auto_ptr 의 소멸자가 호출되어 pa 에 할당된 메모리가 삭제된다.
이처럼 지역 리소스를 조작할 때 쓰이는 포인터는 auto_ptr 을 사용하자.
만약 여기까지 읽다보면 이런 의문이 들 수 있다. 혹, 생성자 또는 소멸자에서 예외가 발생하면 어떻게 될까?
생성자와 소멸자 작성시 반드시 생성자에서는 리소스 누수가 일어나지 않게 하고, 소멸자에서는 예외가 탈출 못하도록 코드를 작성해야 한다.
참고 : More Effective C++
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++