`shared_ptr::use_count() == 0` 和 `shared_ptr::get() != nullptr` 是不是可能?

Posted

技术标签:

【中文标题】`shared_ptr::use_count() == 0` 和 `shared_ptr::get() != nullptr` 是不是可能?【英文标题】: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)? godbolt.org/z/s14jdPYx5 【参考方案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 的所有权。

以上是关于`shared_ptr::use_count() == 0` 和 `shared_ptr::get() != nullptr` 是不是可能?的主要内容,如果未能解决你的问题,请参考以下文章