我对下面的代码有两个问题

时间:2013-03-17 18:16:08

标签: c++ string compiler-warnings c-strings

在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
}

2 个答案:

答案 0 :(得分:3)

您将引用返回到仅在本地使用的值。这是未定义的行为。你可能想要的只是返回一个char指针,或std::string,而不是char指针引用或std::string&

您碰巧看到f()打印出来的事实只是抽奖的运气。它仍然是未定义的行为,并且不能指望。

答案 1 :(得分:2)

f()产生未定义的行为。未定义的行为使您的程序处于无效状态,从而导致(伪随机)崩溃。

这是未定义的行为,因为您返回对本地变量的引用。在函数调用之后,局部变量将被销毁,让char*指向无处,真的。

如果删除引用,则会复制该值,并且我们没有范围违规。