C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 Q&A
C++Builder Programming Q&A
[22740] Re:[질문]스마트포인터에 대해 알고 싶어요.
김백일 [cedar] 5717 읽음    2002-11-20 15:26
보노보노 님이 쓰신 글 :
: 스마트 포인터는무엇인가요?
: 그리고 그게 왜 필요하고 왜 사용해야 하는지 알고 싶어요

C++은 자바와 같은 가비지 컬렉션(GC) 기능이 없어서,
new로 동적 할당한 객체를 매번 delete를 써서 수동으로 삭제해야 하는 건 아실 겁니다.
조심하지 않으면 엄청난 메모리 누수(leak)가 나버리는 버그가 발생할 가능성이 있죠.
(이런 버그를 잡기위해서 바운즈 체커나 코드 가드와 같은 프로그램이 나온거죠.)

예를 들어 보죠.
다음은 Effective STL의 Item 7에 있는 예제입니다.

Widget이라는 클래스가 있다고 가정할 때,
이 클래스를 동적 할당한 후, 이 포인터를 vector에 저장해봅시다.

void doSomething()
{
  vector<Widget*> vwp;
  for (int i = 0; i < SOME_MAGIC_NUMBER; ++i)
    vwp.push_back(new Widget);
  ...
} // vwp가 스코프에서 벗어나는 순간,
// sizeof(Widget) * SOME_MAGIC_NUMBER 만큼의 메모리 누수가 발생합니다!

메모리 누수를 방지하기 위해서는
일일히 수동으로 delete를 해줘야겠죠.
다음과 같은 코드를 doSomething()의 마지막에 추가해야 합니다.

  for (vector<Widget*>::iterator i = vwp.begin(); i != vwp.end(); ++i)
    delete *i;

보통 이렇게 처리하면 잘 동작하는 경우가 많지만,
이렇게 delete 명령을 수행하기 전에 예외(exception)이 발생한다면
역시 메모리 누수가 발생합니다. -_-;;

결국 자동적으로 메모리를 해제시킬수 있는 메커니즘이 있다면,
위와 같은 귀찮은 코딩과 메모리 누수 걱정을 면할 수 있을 겁니다.

스마트 포인터 라이브러리는 여러 가지가 있지만,
Effective STL 저자인 Scott Meyers(스캇 마이어스)는
Boost 라이브러리에 있는 것을 추천합니다.
(마이어스 본인도 스마트 포인터를 만들어 봤지만,
버그 땜에 포기하고 부스트 라이브러리를 쓴다더군요.)

부스트 라이브러리의 스마트 포인터에 대한 문서는 다음 링크를 참고하세요.
http://boost.org/libs/smart_ptr/smart_ptr.htm
http://boost.org/libs/smart_ptr/shared_ptr.htm

위의 예제를 boost::shared_ptr을 써서 고치면 다음과 같습니다.

void doSomething()
{
  typedef boost::shared_ptr<Widget> SPW; // "Shared_Ptr to Widget"
  vector<SPW> vwp;
  for (int i = 0; i < SOME_MAGIC_NUMBER; ++i)
    vwp.push_back(SPW(new Widget));
  ...
} // vwp가 스코프에서 벗어나는 순간, 자동으로 메모리를 해제합니다.

어찌보면, 자바의 GC보다도 더 우수하다고도 할 수 있지요.
하여튼 부스트 라이브러리를 꼭 써보실 것을 권합니다.

+ -

관련 글 리스트
22736 [질문]스마트포인터에 대해 알고 싶어요. 보노보노 1060 2002/11/20
22740     Re:[질문]스마트포인터에 대해 알고 싶어요. 김백일 5717 2002/11/20
22825         Re:Re:답변 감사드립니다. 보노보노 1157 2002/11/24
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.