空shared_ptr的语义
Semantic of empty shared_ptr
我注意到关于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仍然安全吗?
相关文章:
- 何时在引用或唯一指针上使用移动语义
- 如何从具有移动语义的类对象中生成共享指针
- Boost Spirit,获取迭代器内部语义动作
- CLANG 编译器 说:变量"PTR"可能未初始化
- 可以使用移动语义更改或改进此C++代码吗?
- c++在使用指针时移动语义
- 在以唯一ptr为值的C++映射中,动态内存何时会被销毁
- 在C++17中,引用const字符串的语义应该是什么
- 将 ptr 传递给 ptr 到 A 作为参数传递给 A 的函数是不好的做法吗?
- Xcode 语义问题引用或以前定义的代码
- 为共享 ptr 向量实现复制 c'tor?
- 使用移动和复制语义时函数匹配如何工作?
- 将向量从 N1 缩小到 N2 项,而不触发默认构造函数并仅使用 move 语义
- 字符和整数中 **(ptr+1) 的值差异
- C++:在不中断共享的情况下通过引用传递共享 PTR?
- 移动语义和深层/浅层复制之间有什么关系?
- 了解构造函数在移动、复制、赋值语义中的行为
- 如何将派生类从基 ptr 分配给 nlohmann::json
- 引用 std::shared:ptr 以避免引用计数
- 独特的PTR和移动语义