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

xml*_*lmx 2 c++ multithreading lifetime shared-ptr c++11

来自cppref

笔记

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

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

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

Ala*_*les 7

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

例如:

#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";
}
Run Code Online (Sandbox Code Playgroud)

打印 0and为非空use_count()b.get()

请注意,float不是由 的生命周期管理的b,并且是泄漏的。