【问题标题】:The problem of return reference to local variable [duplicate]返回对局部变量的引用问题[重复]
【发布时间】:2010-03-21 19:04:56
【问题描述】:

可能重复:
Returning reference to a local variable

我碰巧发现这段代码返回5。这样写是可以的还是应该避免?

   int& f() {

     int i = 5; 
     return i;
}

int main(){

    cout<<f()<<endl;    
}

【问题讨论】:

标签: c++


【解决方案1】:

如果它起作用,它只是偶然起作用。这是未定义的行为,绝对应该避免。

在 f 返回的那一刻,对于 i 所在的内存会发生什么以及尝试访问它时会发生什么,不再有任何保证。

【讨论】:

【解决方案2】:

编译器警告是正确的——你不能那样做。 i 可能会在某个意想不到的时间被覆盖。

随便

int f() { // don't return reference

     int i = 5; 
     return i;
}

int main(){

    cout<<f()<<endl;    
}

int &f( int &i ) { // accept reference
  // actually, in the case of modify-and-return like this,
  // you should call by value and return by value without
  // using any references. This is for illustration.

     i = 5; 
     return i;
}

int main(){
    int i
    cout<<f(i)<<endl;    
}

【讨论】:

  • 如果你正在修改一个引用参数,返回引用似乎很奇怪(第二个例子)。当然,我并不是说这是错误的。
  • @Steve:有时这是要做的事情。给定这个例子,他似乎想要一个引用和一个返回值。 耸耸肩int 的特殊情况下,使用引用基本上是不正确的。
  • @Steve:当您为自己的类型重载operator&lt;&lt; 时,就会发生这种情况。您使用 ostream&amp; 并返回相同的 ostream&amp;
  • @FredOverflow - 看看有多少人真的讨厌流操作符。顺便说一句,我不是他们中的一员,但你必须承认——他们在不止一个方面绝对是一个特例。例如,它们还为旧操作员赋予了全新的含义 - 不建议将其作为日常实践。
【解决方案3】:

当函数'f()'返回时,堆栈内容将被弹出,变量'i'的内存地址将不再有效。不应使用此代码。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-04-11
    • 2016-01-19
    • 2011-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多