其他
源码分析shared_ptr实现之修订版
点击关注了解更多精彩内容!!
unique_ptr shared_ptr weak_ptr
关于智能指针使用以及区别可以自行查找资料,这里主要介绍智能指针的实现原理。
shared_ptr的实现
_M_use_count是如何加减的
template <typename _Yp>
__shared_ptr(const __shared_ptr<_Yp, _Lp>& __r,
element_type* __p) noexcept
: _M_ptr(__p), _M_refcount(__r._M_refcount) // never throws
{
}
__shared_count(const __shared_count& __r) noexcept : _M_pi(__r._M_pi)
{
if (_M_pi != 0) _M_pi->_M_add_ref_copy();
}
template <>
inline void _Sp_counted_base<_S_single>::_M_add_ref_copy()
{
++_M_use_count;
}
shared_ptr拷贝时,内部shared_count类型的_M_refcount会进行拷贝,shared_count的拷贝构造函数会调用_M_add_ref_copy()方法,_M_add_ref_copy()方法中会将_M_use_count加1。
template <typename _Yp>
_Assignable<const shared_ptr<_Yp>&> operator=(
const shared_ptr<_Yp>& __r) noexcept
{
this->__shared_ptr<_Tp>::operator=(__r);
return *this;
}
template <typename _Yp>
_Assignable<_Yp> operator=(const __shared_ptr<_Yp, _Lp>& __r) noexcept
{
_M_ptr = __r._M_ptr;
_M_refcount = __r._M_refcount; // __shared_count::op= doesn't throw
return *this;
}
__shared_count& operator=(const __shared_count& __r) noexcept
{
_Sp_counted_base<_Lp>* __tmp = __r._M_pi;
if (__tmp != _M_pi) {
if (__tmp != 0) __tmp->_M_add_ref_copy();
if (_M_pi != 0) _M_pi->_M_release();
_M_pi = __tmp;
}
return *this;
}
~__shared_count() noexcept
{
if (_M_pi != nullptr) _M_pi->_M_release();
}
template <>
inline void _Sp_counted_base<_S_single>::_M_release() noexcept
{
if (--_M_use_count == 0) {
_M_dispose();
if (--_M_weak_count == 0) _M_destroy();
}
}
virtual void _M_dispose() noexcept { delete _M_ptr; }
_M_weak_count是如何加减的
_Sp_counted_base() noexcept : _M_use_count(1), _M_weak_count(1) {}
__weak_count(const __weak_count& __r) noexcept : _M_pi(__r._M_pi)
{
if (_M_pi != nullptr) _M_pi->_M_weak_add_ref();
}
template <>
inline void _Sp_counted_base<_S_single>::_M_weak_add_ref() noexcept
{
++_M_weak_count;
}
~__weak_count() noexcept
{
if (_M_pi != nullptr) _M_pi->_M_weak_release();
}
template <>
inline void _Sp_counted_base<_S_single>::_M_weak_release() noexcept
{
if (--_M_weak_count == 0) _M_destroy();
}
virtual void _M_destroy() noexcept { delete this; }
weak_ptr的expired()和lock()做了什么
bool expired() const noexcept
{
return _M_refcount._M_get_use_count() == 0;
}
__shared_ptr<_Tp, _Lp> lock() const noexcept
{
return __shared_ptr<element_type, _Lp>(*this, std::nothrow);
}
__shared_ptr(const __weak_ptr<_Tp, _Lp>& __r, std::nothrow_t)
: _M_refcount(__r._M_refcount, std::nothrow)
{
_M_ptr = _M_refcount._M_get_use_count() ? __r._M_ptr : nullptr;
}
shared_from_this()是如何实现的
class enable_shared_from_this
{
shared_ptr<const _Tp> shared_from_this() const
{
return shared_ptr<const _Tp>(this->_M_weak_this);
}
mutable weak_ptr<_Tp> _M_weak_this;
};
总结
·END·
代码精进之路