空shared_ptr的语义

时间:2013-04-07 20:33:30

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

我注意到有关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语句(代价高昂?)?

感谢任何启发。

3 个答案:

答案 0 :(得分:3)

语义是:

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

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

答案 1 :(得分:1)

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

对于空指针值不需要特殊情况的方式是有道理的。它是否出现在你的代码中只取决于你是否有一些函数可以接受或返回null shared_ptr

答案 2 :(得分:0)

shared_ptr将计算并释放它给出的任何指针(不仅是nullptr,还有一些无效的东西)。所以在你的例子中,这将最终删除nullptr,这是有效的情况。 Is it still safe to delete nullptr in c++0x?