You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 13:45:02