`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() == 0
和 shared_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` 是不是可能?的主要内容,如果未能解决你的问题,请参考以下文章