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 를 사용 하는게 좋겠다.

  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 라이프코리아트위터 공유하기
  • shared
  • 카카오스토리 공유하기