C++中shared_ptr::use_count()==0且get()!=nullptr的情况是否存在?
结论
这种情况完全符合C++标准定义,是真实存在的。
原理说明
std::shared_ptr 内部包含两个独立的成员:
- 指向控制块的指针:负责托管对象的生命周期管理,
use_count()就是该控制块的引用计数 - 存储指针:
get()方法返回的就是该值,和控制块没有强制绑定关系
当我们使用别名构造函数构造shared_ptr时,可以单独指定存储指针的值,完全不需要和控制块托管的对象有关联。如果我们给别名构造函数传入一个无所有权的空shared_ptr作为第一个参数,构造出来的新shared_ptr就会出现use_count() == 0但get() != nullptr的情况。
可运行验证示例
#include <iostream> #include <memory> int main() { int stack_var = 1024; // 第一个参数传入空shared_ptr,无所有权,use_count为0 std::shared_ptr<int> sp(std::shared_ptr<int>(), &stack_var); std::cout << "sp.use_count() = " << sp.use_count() << std::endl; std::cout << "sp.get() = " << sp.get() << std::endl; std::cout << "*sp = " << *sp << std::endl; return 0; }
运行输出结果
sp.use_count() = 0 sp.get() = 0x7ffdabcdef10 // 不同环境地址不同,为非空值 *sp = 1024
注意事项
这种无所有权的shared_ptr不会自动销毁get()返回的指针,使用时需要自行保证指针指向的对象生命周期长于该shared_ptr,避免悬空指针问题。
内容的提问来源于stack exchange,提问作者xmllmx
相关产品推荐
相关产品推荐

