在VS2010中运行此代码,我收到如下所示的警告,但在控制台上输出了C字符串“f()”和“g()”。
问题1:为什么f()生成警告而g()不生成?在程序结束之前,字符串文字是否在静态内存中保留?
问题2:当我在main()中注释掉对h()的调用时,代码崩溃了。为什么不同的行为?
#include<iostream>
const char* const& f()
{
return "f()"; // warning C4172: returning address of local variable or temporary
}
const char* g()
{
return "g()"; // no warning
}
const std::string& h()
{
return "h()"; // warning C4172:
}
int main()
{
std::cout << f() << '\n';
std::cout << g() << '\n';
// std::cout << h().c_str() << '\n'; // comment out and program crashes
}
答案 0 :(得分:3)
您将引用返回到仅在本地使用的值。这是未定义的行为。你可能想要的只是返回一个char指针,或std::string
,而不是char指针引用或std::string&
。
您碰巧看到f()
打印出来的事实只是抽奖的运气。它仍然是未定义的行为,并且不能指望。
答案 1 :(得分:2)
f()产生未定义的行为。未定义的行为使您的程序处于无效状态,从而导致(伪随机)崩溃。
这是未定义的行为,因为您返回对本地变量的引用。在函数调用之后,局部变量将被销毁,让char*
指向无处,真的。
如果删除引用,则会复制该值,并且我们没有范围违规。