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

C++类成员函数返回局部变量的疑问:局部变量销毁后为何能返回值?

为什么返回局部变量old是合法的?

首先先看你给出的代码:

class x{
public:
int m;
int mf(int v){int old = m; m = v; return old; }
};

你这个问题问得特别好,很多刚接触C++的同学都会在这里产生疑惑~

核心原因其实很简单:局部变量old在函数返回时确实会被销毁,但函数返回的是它的值拷贝**,而不是变量本身的地址或者引用**。

咱们一步一步拆解mf()函数的执行流程:

  • 当调用mf(v)时,系统会在栈上创建局部变量old,并把类成员变量m的数值赋值给它
  • 接着更新类成员变量m为传入的参数v
  • 最后返回old的值——这时候编译器会把old存储的数值复制一份,作为函数的返回值传递给调用方
  • 等返回操作完成后,栈上的局部变量old才会被销毁,这时候它的任务已经完成了,销毁行为根本不会影响已经传递出去的那个数值拷贝

这里要特别区分两种情况:

  • 像你现在这样返回基本数据类型的值(比如int):完全安全,因为返回的是拷贝,和原局部变量的生命周期无关
  • 如果返回的是局部变量的指针或引用(比如return &old;):这才会导致问题,因为局部变量销毁后,对应的地址就变成了无效的“野指针”,后续访问会触发未定义行为

打个生活化的比方:你把兜里的10块钱拿出来复印了一份递给朋友,然后把兜里的原钱扔掉了——朋友手里的复印件完全不受影响,照样能用。但如果你递给朋友的是你兜里放钱的那个口袋的钥匙(相当于指针/引用),那你扔掉口袋后,钥匙就没用了,朋友根本找不到钱在哪。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 10:12:09