3

自行分配 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 变化的顺序是未指定的。

我真的不知道在自我分配的情况下会发生什么。

4

2 回答 2

3

根据's上的 cppreference 文档shared_ptroperator=(强调添加):

将托管对象替换为由 管理的对象r

如果*this已经拥有一个对象并且它是最后一个shared_ptr拥有它的对象,并且r与 不同*this,则该对象通过拥有的删除器被销毁。

基本上他们已经想到了这种可能性,需要实施来处理这种情况;自赋值不会删除对象,即使它是对象的唯一所有者。

于 2019-12-14T02:02:27.047 回答
0

自分配是允许的,并且谈论内存泄漏是安全的。事实上,没有任何文档和使用 valgrind 进行的测试表明共享指针的自我分配会导致内存泄漏。

于 2019-12-14T01:39:06.593 回答