临时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
相关产品推荐
相关产品推荐

