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

