2009. 6. 29. 11:29

[C/C++][Boost] Smart Pointer - introduction

Boost 를 공부하면서 그동안 내가 습득하는 스킬들에 대해 정리한적이 없다는 생각에 블로그에라도 남겨야겠다는 생각이다.

Boost 를 처음쓰게 된건 좀더 효율적인 thread 관리를 위한 방법은 없는가를 찾다가 boost의 mutex 를 사용하게 되고, shared_ptr 도 알게되면서다.
그 외에도 수 많은 장점을 지고 있는 boost 를 내 스킬로 만들기 위해 하나 하나 정리해보려고 한다.


Smart Pointer 의 종류

 scoped_ptr  <boost/scoped_ptr.hpp>  오직 하나의 객체만 생성이 가능하고 복사생성자 호출이 불가능, 즉 복사할 수 없다.
 scoped_array  <boost/scoped_array.hpp>  scoped_ptr 과 비슷한 기능의 배열 (하나의 배열만 생성이 가능, 복사 불가)
 shared_ptr  <boost/shared_ptr.hpp>  여러개의 포인터로 객체를 공유할 수 있고, 내부 ref Count 로 유지, 삭제한다.
 shared_array  <boost/shared_array.hpp>  shared_ptr과 비슷한 기능의 배열
 weak_ptr  <boost/weak_ptr.hpp>  shared_ptr로 생성된 pointer를 접근자로서만 사용하기 위한 smart pointer (shared_ptr로 생성된 두 객체가 서로를 가리킴으로 인해 ref count가 줄지 않아 memory leak이 발생하는 경우를 방지. weak count)
 intrusive_ptr  <boost/intrusive_ptr.hpp>  shared_ptr 보다 좀더 원시적인 smart pointer (raw pointer의 접근이 가능하고, ref count 에 직접적으로 접근이 가능)

참조 : boost introduction 원문

Smart Pointer 란?

Pointer를 생성하고 사용할때 있어서 그 무엇보다 가장 중요한것은 생성도 아니요 관리도 아니요, 바로 사용후 제자리에 돌려놓는 '삭제' 다. 20개의 원룸을 가진 주인이 있다고 치자. 입주자들이 방을 이용하기 위해 들어왔지만, 나갈때 한마디 말 없이 나가면, 주인은 아직 그 방에 입주자들이 있다고 생각하고, 방을 이용하고자 하는 사람에게 방을 내줄 수 없는 현상이 발생한다. 즉, 메모리는 한정적인데 생성만 하고 삭제를 하지 아니하면 최후에는 메모리 부족으로 운영체제에 문제가 발생할 가능성이 매우 높다(99.9%). 최근 XP 이후에 들어서는 어느정도 메모리 관리 기능이 들어가있어, 원체 사용하지 않는 메모리는 어느정도 자동 해제해주지만, 그 전 운영체제에서는 OS가 뻗어버리는 경우가 비일비재 했다는 사실. Windows 98 이전에서 블루스크린이 괜히 뜨는게 아니었다는 것이다. 때문에 포인터의 관리는 프로그램을 창조하고자 하는 프로그래머의 몫인데, 본의 아니게 실수로 인해 메모리 해제가 이루어지지 않다보면, 그 버그를 찾는데만도 이만저만 어려운 점을 보완해주기 위해 탄생한 것이 바로 Smart Pointer 이다. 자기 자신을 가리키는 포인터가 존재하지 않을때 소멸자를 호출하는 점이 장점인 것이다.

기존의 Standard Template Library (이하 STL) 에서 smart pointer (auto_ptr) 이 있었으나, 배열 포인터가 지원되지 않고, 내부적으로 복사생성자를 통해 복사 이후 자기 자신을 소멸시켜버린다고 한다. 때문에 container (list, vector 등) 와 같은 tamplate 을 이용시 큰 문제가 될 수 있고, 원천적으로 복사생성자를 수정하여 사용한다 하더라도 언제까지 이와같은 번거로운 문제를 떠안고 코딩을 해야하는데, 프로그래머가 실수를 안한다면 모를까...
이 외에도 여러가지 문제점이 있어 boost의 scoped_ptr이나 shared_ptr 을 사용하게 되는 현실.



이녀석을 최대한 내껄로 만들고 내 시다바리화 시킬때까지 공부는 계속된다.