new로 생성한 포인터의 컨테이너를 사용할 때에는 컨테이너가 소멸되기 전에 delete하는 일을 잊지 말자

void doSomething()
{
vector<Widget*> vwp;
for( int i = 0; i < SOME_NUMBER; ++i )
{
vwp.push_back(new Widget);
}

}

위와 같은 코드를 보면 vwp 라는 컨테이너가 doSomething을 빠져나가면서 소멸될때 메모리가 샐것이라는것을 알수 있다. 이 문제는 스마트포인터를 사용하지 않는 이상 사용자 처리해 주어야 하는데 일반적으로 이렇게 짤수 있다.


struct DeleteObject{
template<typename T>
void operator()(const T* ptr) const
{
delete ptr;
}
};

void doSomething()
{
vector<Widget*> vwp;
for( int i = 0; i < SOME_NUMBER; ++i )
{
vwp.push_back(new Widget);
}

for_each(vwp.begin(), vwp.end() DeleteObject() );
}


하지만 위의 코드 역시 vwp 에 데이타를 삽입한 이후 예외상황이 발생하면 메모리는 새게 된다. 이 문제를 해결하는 방법은 스마트포인터를 사용하는 수밖엔 없다.
스마트포인터는 Boost 라이브러리의 shared_ptr 을 사용하면 좋다.

주의사항 : auto_ptr을 컨테이너에 넣으면 안된다

댓글 남기기

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다