【发布时间】: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