【问题标题】:I have two questions about the code below我对下面的代码有两个问题
【发布时间】:2013-03-17 18:16:08
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

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

      如果您删除引用,则该值将被复制,并且我们不存在范围冲突。

      【讨论】:

      • After the function call the local variable will be destroyed, leaving your char* pointing to nowhere 但是字符串文字不会一直存活到程序结束吗?
      • @user1042389 字面量仍然存在,但指向它的指针已被销毁。
      • @Xymotech 您的意思是与引用关联的指针(可能)?
      • 是的。内存中某处有一个字符串文字,您的函数创建一个指向它的 char 指针并返回对它的引用,但是当函数返回时指针本身被销毁。所以引用指向随机内存(碰巧它指向的可能有你想要的值,但也可能没有)。
      • @Xymotech 但是为什么 VS2010 总是在 f() 中返回一个有效地址?因此,您所说的可能是其他编译器可能会以不同的方式执行此操作。是这个主意吗?
      猜你喜欢
      • 2018-06-27
      • 1970-01-01
      • 2022-06-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多