auto_ptr의 컨테이너는 절대로 만들지 말자

auto_ptr 의 복사의 의미 auto_ptr 하나를 복사(copy)하면, auto_ptr이 가르키는 객체의 소유권은 복사하는 auto_ptr로 옮겨지고 복사되는 auto_ptr은 NULL로 세팅된다. auto_ptr을 복사하는 것은 그 포인터의 값을 바꾸는것 라고 말할수 있다.

auto_ptr<Widget> pw1(new Widget);        // pw1은 생선된 Widget을 가르킨다.
auto_ptr<Widget> pw2(pw1); // pw2는 pw1의 Widget을 가르키고
// pw1는 NULL로 세팅된다.
pw1 = pw2; // pw1는 다시 Widget을 가르키고 pw2는 NULL

여기서 생기는 문제는 STL의 컨테이너에서 값 넣는것 값을 꺼내오는것 대부분의 동작이 복사로 이루어진다는것이다. 간단한 예로 사용자가 vector에서 값을 꺼내올때

auto_ptr<Object> ap = Vec[0];

이라는 코드를 쓸때 ap에는 원하는 값이 들어가지만 Vec[0]에는 NULL로 세팅되어 버리는것이다. STL 의 기본적인 동작뿐만 아니라 알고리즘, 함수 등 모든 부분에서 복사를 사용하므로 auto_ptr을 컨테이너에 넣을 경우 원하지 않는 동작을 하게 될것이다.

auto_ptr을 컨테이너에 넣는 행위는 표준화위원회에서도 금지 이니 그냥 신경 안쓰는게 좋다.

댓글 남기기

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