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

为何weak_ptr::use_count与shared_ptr::use_count返回值可能不同?

std::weak_ptr::use_count 与 std::shared_ptr::use_count 的计数差异场景

实际上,单线程环境下只要weak_ptr关联的对象还存在,weak_ptr::use_count()和shared_ptr::use_count()的返回值完全一致——两者都会返回当前共享对象所有权的shared_ptr实例总数。但在以下场景中,两者可能出现数值差异:

  • 多线程并发修改所有权计数时
    use_count()的实现通常采用内存顺序宽松的加载(memory_order_relaxed),不保证跨线程的计数同步。比如线程A正在创建新的shared_ptr(增加所有权计数),同时线程B分别读取weak_ptr::use_count()和shared_ptr::use_count(),此时可能因线程调度时序问题,两个调用得到的数值不一致。

  • 对象析构的瞬时间隙
    当最后一个shared_ptr被销毁时,对象会被析构,但控制块会保留到所有关联的weak_ptr都被销毁。在这个析构过程的瞬时间隙(比如计数从1降到0的过程中),不同线程读取两者的use_count()可能得到不同值——比如一个读到1,一个读到0。

注意:use_count()仅适合用于调试或测试,绝对不能用它来判断weak_ptr是否过期(应该使用expired()),也不能依赖它的数值做生产环境的逻辑判断——因为它的返回值在多线程下是近似值。

内容的提问来源于stack exchange,提问作者cebola

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 12:25:18