http://breaklee.blog.me/60137887986
shared_ptr 은 간단하게 설명하자면, 가리키고 있는 객체의 수를 관리(참조 카운트)하고,
참조하고 있는 객체의 수가 0 이되면 자동으로 삭제시켜주는 smart pointer 입니다.
소멸자 보면, _Decref() 라는 함수를 호출하고 있습니다. 뭐구현마다 조금씩 차이는 있겠지만,
내부적으로 ref count 를 관리하고 하나씩 줄여주는 역할을 합니다.
당연히, ref count 가 0 이 되면, 제어하고 있는 객체를 delete 합니다.
~shared_ptr() { // release resource this->_Decref(); }
void _Decref() { // decrement use count if (_MT_DECR(_Mtx, _Uses) == 0) { // destroy managed resource, decrement weak reference count _Destroy(); _Decwref(); } } |
오버로딩 된 생성자를 살펴보면 std::auto_ptr 을 인자로 받는 생성자가 보입니다. auto_ptr의 release() 를 호출합니다.
shared_ptr 로 공유하려는 목적으로 사용한다면 의도와는 다르게 auto_ptr 은, 그 후로는 사용할 수 없게 됩니다.
template<class _Ty2> explicit shared_ptr(auto_ptr<_Ty2>& _Other) { // construct shared_ptr object that owns *_Other.get() this->_Reset(_Other); }
template<class _Ty2> void _Reset(auto_ptr<_Ty2>& _Other) { // release resource and take _Other.get() _Ty2 *_Px = _Other.get(); _Reset(_Px, new _Ref_count<_Elem>(_Px)); _Other.release(); } |
한가지 재미는건, bool type 으로 캐스팅 될 경우, 객체의 상태를 질의 할 수 있다는 건데요.
operator _STD _Bool_type() const { // test if shared_ptr object owns no resource return (this->_Get() != 0 ? _CONVERTIBLE_TO_TRUE : 0); } |
결국엔 객체의 주소값으로 TRUE 임을 알려주고 있습니다. 간단한 이해를 위해서 boost 를 잠시 보시면
operator bool () const { return px != 0; } |
그냥 shared_ptr 객체가 가리키고 있는 곳이 0 이 아니면 true 를 리턴하게 되어 있습니다.
오류나 의도치 않은 연산의 방지를 위해(표준 때문에), tr1에서는 멤버 함수의 포인터를 반환하여 예방하고 있습니다.
[출처] shared_ptr|작성자 breaklee
http://humnya.egloos.com/2913729
shared_ptr을 c++ 형식으로 타입 캐스팅 하고 싶을 때는
'메타프로그래밍 > Boost::' 카테고리의 다른 글
boost::thread (0) | 2012.12.25 |
---|---|
boost::weak_ptr (0) | 2012.11.24 |
boost::function (0) | 2012.11.13 |
boost::unordered_set (0) | 2012.11.13 |
Boost::[bind, mem_fn ] 과 STL , 멤버함수 조합사용 (0) | 2012.11.13 |