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

通过引用修改对象能否避免栈对象函数返回后销毁?及代码疑问

C++引用与对象生命周期问题解答

问题1:通过引用编辑对象是否能确保栈上的对象在函数返回后不会被销毁?

这取决于引用指向的对象本身的生命周期:

  • 如果引用指向的是函数外部的栈对象(比如main函数里创建的对象),只要该对象的生命周期还没结束(比如main还没执行完),它就不会被销毁。通过引用对它进行编辑,本质是直接操作这个外部对象的内存,函数返回后该对象依然存活,不存在销毁问题。
  • 但如果引用指向的是函数内部创建的栈对象,那么函数返回后这个内部对象会被销毁,此时引用就变成了悬垂引用,访问它的行为是未定义的。

问题2:代码输出为何符合预期,未出现段错误?

先看你的代码:

#include<iostream>
using namespace std;
template<typename T>
class foo{
    public:
        T a;
        foo(T b){
            this->a = b;
        }
        void print(){
            cout << a << endl;
        }
};
void goo(foo<int>& out){
    foo<int> a(10);
    out = a;
};
int main(){
    foo<int> a(5);    
    a.print();
    goo(a);
    a.print();
    return 0;
}

你误解了代码里的操作逻辑:

  • goo函数接收的out是main函数中a对象的引用,它从始至终都绑定在main::a上(引用一旦绑定就无法更改指向)。
  • out = a;这行代码不是让out指向goo内部的栈对象a,而是执行赋值操作:把goo::a的成员值(10)拷贝到out所绑定的main::a的成员中。
  • goo函数返回时,内部的a(10)确实会被销毁,但这和main::a无关——main::a的生命周期由main函数控制,此时它还存活,你后续调用a.print()访问的是main栈上的a,自然能正确输出10,不会触发段错误。

如果你的意图是让函数返回一个新对象的引用,那确实会有悬垂引用风险,但当前代码的逻辑是修改外部已存在的对象,完全不存在这个问题。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 00:52:09