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