这个是正解。
我看的2017, shared_ptr<A> pA = make_shared<A>();
调用的是move版本的拷贝构造,
shared_ptr(shared_ptr&& _Right) noexcept
{
this->Move_Construct_from(_STD move(_Right))
}
Move_Construct_from(...&& _Rithgt)
{
_Ptr = _Right.Ptr;
_Rep = _Right._Rep;
_Ptr = nullptr;
_Rep = nullptr;
}
【 在 z16166 的大作中提到: 】
: 楼主的例子应该有问题,原因在于shared_ptr<T>的operator=( )内部的_Swap()在操作智能指针本身的数据时不是原子操作,是分成两步的。_Swap()交换的数据包括裸指针、引用计数两部分,在两个swap()之间数据如果被其他线程操作了,就出问题。
: 下面这个代码是VC2019里的:
: void _Swap(_Ptr_base& _Right) noexcept { // swap pointers
: ...................
--
FROM 124.114.151.*