std::auto_ptr 에 대한 이야기이다. 이것은 표준에 있는 스마트 포인터 이기 때문에, 스마트 포인터의 대표격이다. 물론 C++ 0x 에선 shared_ptr 이 .. 대표로 갈아치우지 않을까 한다. : )
질문 1. auto_ptr을 잘못 사용 하고 있는 코드이다. 한번 찾아 보아라.
질문 1은 바로 답을 말하면, 배열을 담았다는 데에 있다. auto_ptr 은 배열을 담는다 해도 delete[] 를 호출해 주지 않기 때문에 문제이다.
질문 2. 이 문제를 어떻게 해결할 것이며, 어댑터 패턴이나 생성 작업의 문제점과 auto_ptr에 대한 대안 등 가능한 모든 해결 책을 제시하라.
질문 1에서의 문제점을 해결하는 방법은 .. boost::scoped_array 을 사용 한다! 라고 하면 공부가 안되니, 각 단계별 분석해보고 scoped_array 를 사용하자. : )
해결책 1 : auto_ptr 상속 해서 구현하기
처음에 생각한 방법은 auto_ptr 을 상속받아 auto_array 를 만들 생각이었으나 memory 헤더에 가서, 멤버 함수들을 보는 순간, virtual 선언 된게 없고, 오히려 더 많은 문제점(소멸자가 virtual 이 아니다, 상속의 이름 가림, private 상속을 하면, 모든 정의를 재 정의 해야 한다, operator 재정의; .. 등등등 다 이해해야지만 가능하다)이 있기 때문에, 하느니 안하느니 못한 경우가 생긴다.
해결책 2 : auto_ptr 복사 하여 delete 구문을 delete[] 로 바꾸기.
충분히 괜찮다고 생각 한다. .. 하지만 이럴 거면 .. boost::scoped_array 를 사용 한다.
해결책 3 : 어댑터 패턴 이용하기
이렇게 어댑터를 만들고, 사용 하면 된다. auto_ptr의 구조를 더럽히지 않고, 충분히 제 역활을 하게 한다. 단점이라면, 가독성이 어렵고, 쓸데없는 접근을 많이 거쳐야 한다는 것이 있다.
해결책 4 : auto_ptr을 직접 작성한 예외 처리 로직으로 바꾸기
우선 .. 이걸 생각했다는 자체에 의의를 두어야 한다. .. 하지만 사용하지 말아야 한다. 왜냐하면, 구현이 복잡해 지고, 더 어려워지는 경향이 많을 뿐더러 유지보수에 큰 애를 먹기 때문이다.
해결책 5 : 배열 대신 vector 사용 하기
.. 발상의 전환은 언제나 신선하다. 차라리 std::vector 를 사용 하면 되겠다.^^
총평
재미있는 항목이였다. 배열에 대한 포인터는 vector 을 사용하면서 전혀 사용하지 않았던 터러 auto_ptr의 auto_array의 재정의에 대해서 전혀 생각치 못하고 있었다.(사용하지 않지만) 그런 의미에서 생각을 전환하여, 다른 방법을 모색하는 것에 큰 의미를 둔다.
개인적으로 꼭 써야 한다면, scoped_array 나 shared_array 를 사용 하는게 좋겠다.
'책 정리 > More Exceptional C++' 카테고리의 다른 글
항목 26 : 다중 상속과 샴 쌍둥이 문제 ( 난이도 : 4 ) (0) | 2008.12.16 |
---|---|
항목 25 : 다중 상속 에뮬레이션 ( 난이도 : 5 ) (0) | 2008.12.16 |
항목 24 : 왜 다중 상속을? ( 난이도 : 6 ) (0) | 2008.12.16 |
항목 31 : 스마트 포인터 멤버 Part 2 : ValuePtr을 향해 ( 난이도 : 6 ) (0) | 2008.12.14 |
항목 30 : 스마트 포인터 멤버 Part 1 : auto_ptr로 인해 생길 수 있는 문제 ( 난이도 : 5 ) (0) | 2008.12.14 |
항목 35 : #define (난이도 : 4) (0) | 2008.12.13 |
항목 34 : 전처리 매크로 ( 난이도 : 4 ) (0) | 2008.12.13 |
항목 33 : 네스티드 함수 시뮬레이션 (nested function) ( 난이도 : 5 ) (0) | 2008.12.13 |
항목 32 : 재귀적인 선언 ( 난이도 : 6 ) (0) | 2008.12.13 |
항목 40 : 네임스페이스 Part 2 : 네임스페이스로 마이그레이션(migration) (난이도 : 4) (0) | 2008.12.08 |
최근댓글