【问题标题】:R-value reference to a temporary object does not segfault对临时对象的 R 值引用没有段错误
【发布时间】:2021-06-21 03:17:23
【问题描述】:

我正在检查this stack overflow answer,我正在尝试自己的东西以求理解。在答案中,作者在行中说

自动&& __range=exp;

你的 exp 创建一个临时对象,然后返回一个对 在其中。在那条线之后临时死掉,所以你有一个悬空 其余代码中的参考。

我对这一行的理解: S() 返回一个S 类型的临时对象,.func() 就返回了对这个临时对象的引用。变量__range 指向一个不存在的位置,因为S 类型的对象在该行的末尾被销毁。

所以我编写了一个类似的程序(如下),并进行了一些修改,并期望它能够 SEGFAULT,但它根本没有 SEGFAULT。

#include <iostream>
#include <string>
#include <map>
using namespace std;

struct S
{
    map<int, int> m;

    S()
    {
        m[24] = 5;
    }

    const int &func() const
    {
        return m.find(24)->second;
    }
};

int main()
{
    auto &&x = S().func();
    std::cout<<"\n value is "<<x;

    return 0;
}

我不确定自己理解上的差距。帮帮我。提前致谢。

【问题讨论】:

  • UB 意味着一切皆有可能,它不必 SEGFAULT。
  • 请参阅stackoverflow.com/questions/2397984/…。当行为未定义时,可能会产生任何后果,您不应期望“segfault”或其他一些特定后果
  • 呼应@M.M 所说的:你说(意译)“我知道这是未定义的行为,但我希望它会这样做this”。这是否使矛盾更加清晰?
  • UB 之外,理解为什么特定代码以某种方式执行会很有帮助,比如不会崩溃。将段错误视为取消引用错误内存地址的结果。但在特定情况下的地址还不错,只是陈旧。

标签: c++ reference segmentation-fault c++17 rvalue-reference


【解决方案1】:

期待它SEGFAULT

这是错误的。没有 C++ 语言保证段错误的条件。事实上,段错误的概念对于语言本身来说是完全陌生的。

根据 C++ 语言,程序的行为是未定义的。这意味着任何事情都可能发生。 Segfault 可能会发生,但不能保证一定会发生。对程序的行为没有任何保证。

【讨论】:

    【解决方案2】:

    如果你用地址清理器构建程序,你会得到:

    摘要:AddressSanitizer:heap-use-after-free

    在这一行:

    uto &&x = S().func();
    

    内存问题可能不会立即使您的程序崩溃,但它们可能会使长时间运行的程序在其他函数或其他线程中崩溃,从而导致非常奇怪的崩溃情况。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-01-05
      • 2021-11-11
      • 2011-02-14
      • 2016-01-17
      • 1970-01-01
      • 2016-02-04
      相关资源
      最近更新 更多