【问题标题】:Is it possible that `shared_ptr::use_count() == 0` and `shared_ptr::get() != nullptr`?`shared_ptr::use_count() == 0` 和 `shared_ptr::get() != nullptr` 是否可能?
【发布时间】:2022-01-03 23:24:55
【问题描述】:

来自cppref

备注

一个空的 shared_ptr(其中 use_count() == 0)可以存储一个 get() 可访问的非空指针,例如如果它是使用创建的 别名构造函数。

shared_ptr::use_count() == 0shared_ptr::get() != nullptr 有可能吗?

有什么例子可以说明这是真的吗?

【问题讨论】:

  • 您的引文确实回答了您的问题...
  • 您是否尝试过使用别名构造函数(构造函数列表中的#8)?

标签: c++ multithreading c++11 shared-ptr lifetime


【解决方案1】:

如注释中所述,别名构造函数会导致这种情况发生。

例如:

#include <memory>
#include <iostream>

int main()
{
    std::shared_ptr<int> a = nullptr;
    std::shared_ptr<float> b(a, new float(0.0));
    std::cout << b.use_count() << "\n";
    std::cout << (b.get() == nullptr) << "\n";
}

prints 0 对于use_count()b.get() 是非空的。

请注意,float 不受 b 的生命周期管理并且已泄露。

【讨论】:

  • 值得补充:浮点数泄露的原因是因为别名构造函数应该被传递一个指向第一个shared_ptr拥有的对象的某个子对象的指针。
  • @o11c 不正确,指针不是必需的,甚至不需要是引用的 shared_ptr 的子对象。它只是get() 返回的原始指针,它可以是调用者想要的任何东西。重要的是指针根本不被新的 shared_ptr 管理或销毁。只是新的 shared_ptr 共享所引用的 shared_ptr 的所有权。
猜你喜欢
  • 2018-07-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-08
  • 1970-01-01
  • 2015-09-14
  • 2012-04-15
  • 1970-01-01
相关资源
最近更新 更多