【问题标题】:Semantic of empty shared_ptr空 shared_ptr 的语义
【发布时间】:2013-04-07 20:33:29
【问题描述】:

我注意到一个关于 shared_ptr 的奇怪事实

int* p = nullptr;
std::shared_ptr<int> s(p); // create a count (1).
std::shared_ptr<int> s2(s); // count go to 2.
assert(s.use_count() == 2);

我想知道除此之外的语义是什么。为什么 s 和 s2 共享一个 nullptr ?这有意义吗?

或者这种不常见的情况不值得使用 if 语句(代价高昂?)?

感谢您的启发。

【问题讨论】:

  • AFAICT,它是否为 null 或是否为有效对象都没有区别,那么它为什么要关心呢?
  • 我不认为引用计数指针对 nullptr 有特殊处理。
  • 在 C++11 中,use_count() 在空的shared_ptr (20.7.2.2.5/7) 上必须是0
  • 感谢回复:)

标签: c++ shared-ptr reference-counting nullptr


【解决方案1】:

语义是:

  • 如果你默认构造一个共享指针,或者从nullptr_t构造一个,它是空的;也就是说,它不拥有任何指针。
  • 如果您从原始指针构造一个,它会获得该指针的所有权,无论它是否为空。我猜这是因为你提到的原因(避免运行时检查),但我只能推测。

所以你的例子不是空的;它拥有一个空指针。

【讨论】:

  • 谢谢,我想没关系。顺便说一句,引用计数器分配比运行时检查要昂贵得多(但这种情况肯定不那么频繁)。
【解决方案2】:

谁在乎他们分享nullptr?一旦它们都被销毁,它们将尝试delete nullptr;,这将无效。这完全没问题,符合shared_ptr 的语义。

这很有意义,因为空指针值不需要特殊情况。它是否出现在你的代码中只是归结为你是否有一些函数可以接受或返回 null shared_ptrs。

【讨论】:

  • 感谢您的快速回复!
【解决方案3】:

shared_ptr 将计算并释放它给出的任何指针(不仅是 nullptr,还有一些无效的指针)。因此,在您的示例中,这将导致 nullptr 被删除,这是有效的情况。 Is it still safe to delete nullptr in c++0x?

【讨论】:

    猜你喜欢
    • 2021-09-24
    • 1970-01-01
    • 1970-01-01
    • 2017-06-16
    • 2020-08-12
    • 2010-10-11
    • 1970-01-01
    • 2022-01-23
    相关资源
    最近更新 更多