首先來看shared_ptr,先貼一小部分vs2013裡的實現
// template class shared_ptr
template
class
shared_ptr
: public _ptr_base<_ty>
template
explicit
shared_ptr(_ux *_px)
template
class _dx>
shared_ptr(_ux *_px, _dx _dt)
shared_ptr(nullptr_t)
......
}
我們可以看到shared_ptr首先繼承了_ptr_base。把_ptr_base部分**貼上來
// template class _ptr_base
template
class _ptr_base
_ptr_base(_myt&& _right)
: _ptr(0), _rep(0)
template
_ptr_base(_ptr_base<_ty2>&& _right)
: _ptr(_right._ptr), _rep(_right._rep)
_myt& operator=(_myt&& _right)
private:
_ty *_ptr;
_ref_count_base *_rep;
template
friend
class _ptr_base;
}
可以發現_ptr就是用來儲存原始指標的變數,_rep是_ref_count_base型別的指標,根據變數名大概就是引用計數了。再把_ref_count_base的**貼上來
// class _ref_count_base
class _ref_count_base
public:
virtual ~_ref_count_base() _noexcept
bool _incref_nz()
}unsigned
int _get_uses() const
void _incref()
void _incwref()
void _decref()
}void _decwref()
long _use_count() const
bool _expired() const
virtual
void *_get_deleter(const _xstd2 type_info&) const
};
比較短就全貼上來了,可以看到_uses和_weaks都被初始化成1。當我們平時使用 std::shared_ptr a(new int(1)) 這種形式,shared_ptr會使用_resetp()來初始化。把_resetp()**貼上來
templatevoid _resetp(_ux *_px)
...public:
template
void _resetp0(_ux *_px, _ref_count_base *_rx)
....
// template class _ref_count
templateclass _ref_count
: public _ref_count_base
private:
virtual
void _destroy()
virtual
void _delete_this()
_ty * _ptr;
};....
void _reset0(_ty *_other_ptr, _ref_count_base *_other_rep)
可以看到最終在_reset0中原始指標和在堆中的引用計數的指標都被儲存下來,乙個有趣的發現在引用計數中還儲存著乙份原始指標,有時間再慢慢探索。 C 11智慧型指標
本文介紹c 的四種智慧型指標,其中後三種是c 11新增加的,auto ptr已被棄用。要編譯c 11,需要安裝g 4.8 sudo add apt repository ppa ubuntu toolchain r test sudo apt get update sudo apt get inst...
c 11 智慧型指標
如果在程式中使用new從堆 自由儲存區 分配記憶體,等到不需要時,應使用delete將其釋放。c 引入了智慧型指標auto ptr,以幫助自動完成這個過程。c 11摒棄了auto ptr,並新增了三種智慧型指標 unique ptr,shared ptr,weak ptr。一.auto ptr,un...
C 11 智慧型指標
c 11中有unique ptr shared ptr與weak ptr等智慧型指標 smart pointer 定義在 memory 中。可以對動態資源進行管理,保證任何情況下,已構造的物件最終會銷毀,即它的析構函式最終會被呼叫。unique ptr持有對物件的獨有權,同一時刻只能有乙個uniqu...