c++ - 将 shared_ptr 分配给自身安全吗?
问题描述
自行分配 a 是否安全std::shared_ptr
?所以这里有一个例子:
std::shared_ptr<std::vector<std::string>> pVec = std::make_shared<std::vector<std::string>>();
std::cout << pVec.use_count() << std::endl; // 1
pVec = pVec;
我知道分配一个shared_ptr
对象:
- 将减少左侧(LHS)操作数引用计数(RC),然后检查它是否为0(这些先前的操作是原子完成的),如果是则释放资源;
- 此外,将增加右侧(RHS)RC。
所以在这个例子中,对象在 LHS 和 RHS 上都是相同的,并且赋值运算符中这两个 RC 变化的顺序是未指定的。
我真的不知道在自我分配的情况下会发生什么。
解决方案
根据's上的 cppreference 文档shared_ptr
operator=
(强调添加):
将托管对象替换为由 管理的对象
r
。如果
*this
已经拥有一个对象并且它是最后一个shared_ptr
拥有它的对象,并且r
与 不同*this
,则该对象通过拥有的删除器被销毁。
基本上他们已经想到了这种可能性,需要实施来处理这种情况;自赋值不会删除对象,即使它是对象的唯一所有者。
推荐阅读
- excel - Excel VBA 文本文件导入为空白
- taskbar - Is it possible to 'Pin to taskbar' using Inno Setup?
- css - The background image in my react application is not showing
- python - 在大型一维 NumPy 数组中切片模式
- asp.net - Can you add sso using OpenConnectId to a web application that uses MVC Asp.identity?
- javascript - React native check if a passed parameter is a valid color
- xamarin.forms - 模块化应用设计
- r - Why is an elementwise product of a matrix much faster with apply?
- php - 将数据追加到表中的新行
- r - 将对象上的信息存储为该对象的属性是不好还是好的做法?