空shared_ptr的语义

Semantic of empty shared_ptr

本文关键字:语义 ptr shared      更新时间:2023-10-16

我注意到关于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共用一个空ptr ?这有意义吗?

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

语义为:

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

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

谁在乎他们共享nullptr ?一旦他们都被摧毁,他们就会尝试delete nullptr;,这是没有效果的。这完全可以,并且符合shared_ptr的语义。

这是有意义的,因为空指针值不需要特殊情况。它是否发生在你的代码中取决于你是否有一些函数可以接受或返回空shared_ptr s

shared_ptr将计数并释放给定的任何指针(不仅是nullptr,还有一些无效的指针)。在你的例子中,最终会删除nullptr,这是有效的情况。在c++0x中删除nullptr仍然安全吗?