我尝试过以下方法:
std::string* Member::GetName()
{
std::string name2 = "sdfsdfsd";
return &name2;
}
std::string* name;
Member m;
name = m.GetName();
std::cout << *name << std::endl;
并且&#34;工作&#34;,但在调用GetName()之后,name2不可用?我的指针指向什么?
编辑:
多年后回来更多exp。 一些人已在下面回答了这个问题。
返回本地是坏事!如果堆栈上的值没有被覆盖,你可能会侥幸逃脱它,所以通常当你在返回本地后直接使用它时你可能得到正确的值,但是这仍然是未定义的行为。 也没有返回const&amp;也不起作用,即使现在有时我认为它将返回值绑定到临时值,就像它对const&amp; amp;参数,但不是返回类型的情况,返回r值refs也是如此。 你只能返回一个副本,并将其作为const ref,如此
std::string GetName();
const std::string& name = GetName();
这将它绑定到临时因此是有效的检查草药sutters gotw: https://herbsutter.com/2008/01/01/gotw-88-a-candidate-for-the-most-important-const/ 对于const ref temporaries。
答案 0 :(得分:3)
获取本地堆栈变量的地址,并在它不再在范围内时使用它未定义的行为。
至于&#34; 它起作用&#34;,它并不意味着它将始终有效或者这是一种可靠的做法。返回时,堆栈不会立即被清除。看看&#34; undefined behavior&#34;
的定义