通过引用修改对象能否避免栈对象函数返回后销毁?及代码疑问
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
相关产品推荐
相关产品推荐

