1

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

感谢您的任何启发。

4

3 回答 3

3

语义是:

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

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

于 2013-04-07T20:40:39.937 回答
1

谁在乎他们正在共享nullptr? 一旦它们都被摧毁,它们就会尝试delete nullptr;这将没有任何效果。这完全没问题,并且符合shared_ptr.

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

于 2013-04-07T20:35:22.937 回答
0

shared_ptr 将计算并释放它给出的任何指针(不仅是 nullptr,而且还有一些无效的指针)。因此,在您的示例中,这将导致 nullptr 被删除,这是有效的情况。 在 c++0x 中删除 nullptr 是否仍然安全?

于 2013-04-07T20:38:38.160 回答