C ++函数返回引用

时间:2011-05-12 23:43:23

标签: c++

这是另一个n00b问题:

为什么我不能/不应该将referece返回到函数的局部变量?是因为临时变量在函数执行完毕后会自动销毁吗?

const string & wrap(string & s1, const string & s2){
    string temp;
    temp = s2 + s1 + s2;
    return temp;
}

这个怎么样:

const string & wrap2(const string & s1, const string & s2){
    return (s2 + s1 + s2);  
}

4 个答案:

答案 0 :(得分:10)

在函数内部声明的变量在堆栈上分配。当函数返回到调用者时,堆栈中用于驻留的变量的空间被回收并且不再可用,并且那里的变量不再存在(他们确实做了但你不能使用它们,它们可以是随时覆盖)。所以是的,基本上就是你所说的。

答案 1 :(得分:7)

就是这样。局部变量变为 poof ,并在超出范围时被销毁。如果你返回一个引用或指针,那个引用或指针将指向垃圾,因为该对象将不再存在。

答案 2 :(得分:3)

  

“这个怎么样:   ......“

s2 + s1 + s2本身就是一个临时局部变量,所以它也不能通过引用返回。

你可以做什么 - 但请不要,这是内存泄漏! - 是

const string & wrap2(const string & s1, const string & s2){
  string *pt = new string(s2+s1+s2);
  return *pt;
}

这会创建一个全局有效的字符串,然后可以通过引用传递它,因为它在函数完成执行后不会被销毁。事实上,只要程序运行,它就永远不会被破坏并占用空间:你可能不希望这样!

如果它不是const引用,您可以手动delete

编辑:所以事实证明你甚至可以删除const引用,但是再次 - 这不是很好。

答案 3 :(得分:1)

就像之前的海报所说,这是因为局部变量最终会出现在堆栈上。当你的指针仍悬挂在同一位置(现在已经改变)时,物理内存可能最终被赋予另一个功能框并被更改。我不确定,但我不认为是“被破坏”,但它肯定不会被任何未来的堆栈分配所保护。