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

临时shared_ptr对象生命周期疑问:为何输出为1而非2?

临时对象生命周期异常输出的技术解释

你提到的C++标准规则(N4140 §12.2)是临时对象销毁的通用逻辑,但这里有个容易被忽略的关键例外,正是它导致你看到Case1和Case2输出为1而非2:

当临时对象被绑定到const左值引用(const T&)或者右值引用(T&&)时,它的生命周期会被延长至该引用的生命周期结束,而非在创建它的完整表达式末尾就销毁。

举个最贴合你场景的例子(我推测你的Case1/Case2核心逻辑类似这样):

#include <iostream>
int count = 0;

class DemoObj {
public:
    DemoObj() { count++; }   // 构造时计数+1
    ~DemoObj() { count--; }  // 析构时计数-1
};

// Case 2 可能的简化场景
void test_simple() {
    const DemoObj& ref = DemoObj();  // 临时对象绑定到const引用
    std::cout << count << std::endl; // 输出1
}

int main() {
    test_simple();
    return 0;
}

为什么这里输出是1?

  • 正常情况下,DemoObj()创建的临时对象会在const DemoObj& ref = DemoObj();这个完整表达式结束时立刻销毁,此时count会回到0,输出应该是0。
  • 但因为临时对象被绑定到了const DemoObj&类型的引用,根据标准的例外规则,它的生命周期被延长到了ref的生命周期结束——也就是test_simple函数执行完毕的时候。所以在执行std::cout时,临时对象还没有被析构,count的值是1。

如果你的Case1是更复杂的场景(比如函数返回临时对象并被引用接收),核心逻辑也是一样的:返回的临时对象本应在函数调用的完整表达式末尾销毁,但绑定到引用后生命周期被延长,导致计数没有立刻递减,最终输出1。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 09:00:36