블로그는 귀차니즘

First Sensation
  • 공지
  • 지역로그
  • 태그
  • 방명록

std::auto_ptr - Smart Pointer 이지만??

Language 2008/04/13 23:59 귀차니스트

  boost::shared_ptr 에 대해서는 이미 아시고 계실테고, 관심이 더욱 있으신 분, 혹은 이미 아시는 분들은 boost::scoped_ptr 에 대해서도 알고 계실겁니다. 그런데 C++ 에도 표준으로 원래 존재하는 Smart Pointer가 존재합니다. 그 이름은 auto_ptr<> 입니다. 어떤 것이냐구요??

autoptr.cpp (Language : cpp)
  1. #include <memory>
  2. #include <iostream>
  3.  
  4. int main(int argc, char **argv)
  5. {
  6.     std::auto_ptr< int > aa( new int );
  7.  
  8.     *aa = 100;
  9.  
  10.     std::cout << *aa << std::endl;
  11.  
  12.     return 0;
  13. }

  대충 이렇게 사용합니다. 그럼 scope를 벗어 날때 auto_ptr의 ~소멸자가 호출됨으로 인하여 해당 보관 메모리를 해제하게 됩니다. 그런데 사용은 아주 간단하게 보이지만 신경 써주어야하는 점이 몇가지 있습니다. 무엇인가 하면 new와 new [], delete, delete []의 차이점 때문이죠.

~auto_ptr.cpp (Language : cpp)
  1. ~auto_ptr()
  2. {   // destroy the object
  3.     if (_Myptr != 0)
  4.         delete _Myptr;
  5. }

  소멸자에서 사용하는 부분이 delete [] 가 아닌 delete이기 때문에 실질적으로 생성자에서 new int 가 아닌 new int[ 100 ] 과 같은 구문을 사용하였을때, 하나의 개체를 제외하고는 소멸자가 호출되지 않습니다. 그리고 할당된 개체가 int, double 등의 기본 타입이 아닌 메모리를 또 개별적으로 관리하는 개체일 경우는 더 큰 문제가 발생하게 되겠죠.
  또 하나 생길 수 있는 문제점이란 무엇일까요?? 바로 = operator overloading으로 인한 소유권 이전에 대한 문제점입니다.

auto_ptr.cpp (Language : cpp)
  1. auto_ptr<_Ty>& operator=(auto_ptr<_Ty>& _Right) _THROW0()
  2. {   // assign compatible _Right (assume pointer)
  3.     reset(_Right.release());
  4.     return (*this);
  5. }
  6.  
  7. void reset(_Ty* _Ptr = 0)
  8. {   // destroy designated object and store new pointer
  9.     if (_Ptr != _Myptr && _Myptr != 0)
  10.         delete _Myptr;
  11.     _Myptr = _Ptr;
  12. }

  이렇게 구현이 되어있기 때문에 _Right에 해당하는 개체는 _Myptr이 삭제 되고, 해당 개체가 소유권을 이전 받기 때문에 문제점이 존재할 여지가 있습니다.
  어떤 부분에서냐고 물어보신다면 물론 이 것이 STL Container 과 같은 부분에서 사용이 되거나, 코드 도중 사용이 된다면 소유권이 넘어감으로 인하여 예상치 못한 점이 발생할 수 있다는 점이죠. 물론 코딩을 하는 사람치고 이런 것을 알아보지 않고 바로 사용하는 경우는 거의 없겠지만, 보통의 경우를 생각하고 코딩할 경우는 무척 문제가 될 수 있습니다. 실제로 STL Container의 경우 내부에서 대입문이 존재하는 알고리즘을 사용했을 때, 개체에 대한 메모리가 존재하지 않는 경우가 생깁니다. 이는 프로그램이 예상대로 동작하지 않는다는 소리가 됩니다. 그로인해 프로그램은 오작동 혹은 버그가 생길테구요.
  이러한 점을 보았을 때엔, 편리하지만 문제점이 존재하는 소스 양날의 검이 되지 않기 위해선 사용하기 이 전에 파악을 먼저하고 사용해야 하지 않을까 하는 생각이듭니다.

크리에이티브 커먼즈 라이센스
Creative Commons License
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-동일조건변경허락 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.

"Language" 분류의 다른 글

boost::spirit - Parser 라이브러리 (0)2008/04/23
std::ostreambuf_iterator, std::istreambuf_iterator의 이유 (1)2008/04/16
C# Application - Main 에서 Try-Catch 오작동 해결하는 방법 (4)2008/04/07
Boost 1.35 - 워크샵 뒤의 포스팅 (2)2008/04/03
C# Generics - Generics 문법의 사용법 (0)2008/03/21
2008/04/13 23:59 2008/04/13 23:59
TAG auto_ptr, C++, smart Pointer, std::auto_ptr
트랙백은 하나, 댓글 하나가 달렸습니다.

트랙백 주소 :: http://www.filewiki.net/tc/trackback/50

  1. Subject: 궁극의 예외처리

    Tracked from 이름없는 블로그 2008/05/16 18:16  삭제

    예외 처리 개념 위키 백과 : http://ko.wikipedia.org/wiki/%EC%98%88%EC%99%B8_%EC%B2%98%EB%A6%AC 이번 예외처리는 중요한부분을 8 챕터로 More Effecitve C++ 에서 설명한다. 항목 9 : 리소스 누수를 피하는 방법의 정공은 소멸자이다. 항목 10 : 생성자에서는 리소스 누수가 일어나지 앟게 하자. 항목 11 : 소멸자에서는 예외가 탈출하지 못하게 하자. 항목 12 : 예외 발생이 매개변..

댓글을 달아 주세요

  1. kevin 2008/10/15 17:02  댓글주소  수정/삭제  댓글쓰기

    잘보고 갑니다.^^

    깔끔하게 정리하셨네요~

◀ 이전페이지 1 다음페이지 ▶

블로그 이미지
First Sensation 귀차니스트
rss
  • 관리자
  • 글쓰기

카테고리

  • 전체 (108)
    • Computer (3)
    • Language (14)
    • Reverse Engineering (1)
    • Algorithm (9)
    • TopCoder (3)
    • Library (2)
    • Programming (19)
    • Programming Tip (9)
    • PSP-Programming (10)
    • Program (5)
    • Small Talk (29)
    • Document (4)

최근에 올라온 글

  • 한게임 자동테트리스 Ve....
  • Intel 64 And IA32 Arch.... (1)
  • 한게임 자동테트리스 Ve.... (18)
  • 재귀적 합성이랄지...
  • 또 오랜기간의 공백을....

최근에 달린 댓글

  • 오오~ 멋진데 :) 좋은 일 하.... kkamagui 11/17
  • .. 그렇군요;;.. 사실 뭐 저.... 귀차니스트 11/16
  • 고생은하셨다만.. 벌써 프로.... 뉴올리언스 11/16
  • 이 부분은 본문에 명시되어.... 귀차니스트 11/15
  • 관리자만 볼 수 있는 댓글입.... 비밀방문자 11/15

달력

«   2008/11   »
일 월 화 수 목 금 토
            1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30            

링크

  • kkamagui 프로그래밍 세상.
  • 류광의 번역 이야기.
  • 서광열의 프로그래밍 언....
  • 준호씨의 블로그.
  • 최익필의 이름없는 블로그.
  • 위키는 귀차니즘.

최근에 받은 트랙백

  • 궁극의 예외처리. 이름없는 블로그 05/16
  • Maximum sum. 티스토리 지점 04/09

글 보관함

  • 2008/11 (3)
  • 2008/10 (2)
  • 2008/09 (3)
  • 2008/08 (5)
  • 2008/07 (13)

태그목록

  • C++ Builder
  • 프로그래밍
  • GDI+
  • SSD
  • C++
  • 디인터레이스
  • Sector
  • HTML
  • 프로토타입
  • Singleton
  • Bootloader
  • DP
  • boost::shared_ptr
  • 전위연산
  • System.Xml
  • Develope
  • 뻘글
  • 개발
  • Filtering
  • 테트리스
  • 한국가상캠퍼스
  • std::copy
  • PSP
  • boost::random
  • tr1
  • TopCoder
  • istream_iterator
  • HTML 파서
  • Builder
  • GUI

지역로그 : 태그 : 방명록 : 관리자 : 글쓰기
귀차니스트’s Blog is powered by Textcube 1.7.5 : Risoluto / Designed by DesignNia.net