reset的实现
reset是一个常用的shared_ptr函数,文档请参考链接。
shared_ptr自己没有实现reset,而是基类__shared_ptr实现的:
1287 template<typename _Yp>
1288 _SafeConv<_Yp>
1289 reset(_Yp* __p) // _Yp must be complete.
1290 {
1291 // Catch self-reset errors.
1292 __glibcxx_assert(__p == 0 || __p != _M_ptr);
1293 __shared_ptr(__p).swap(*this);
1294 }
有用的就1293行一句话。当其背后却隐藏了大量代码:
- 创建匿名栈变量,并由构造函数初始化。有个新的计数体_Sp_counted_ptr被new出来,由匿名栈变量的_M_pi指向。
1078 class __shared_ptr
1120 template<typename _Yp, typename = _SafeConv<_Yp>>
1121 explicit
1122 __shared_ptr(_Yp* __p)
1123 : _M_ptr(__p), _M_refcount(__p, typename is_array<_Tp>::type())
1124 {
1125 static_assert