作者:智慧曜彰_272 | 来源:互联网 | 2023-10-12 12:47
class fu
{
public:
int pub;
fu() { pub = 1; }
~fu() {
std::cout < }
};
fu& fub() {
fu a;
fu& re = a;
return a;
}
int main() {
std::cout <<++fub().pub;
}
输出:1尾\ n 2
我希望引用会出错,因为函数中的变量已终止。但是,析构函数被调用并且主要功能起作用。参考指向什么?
您正在返回对局部变量的引用。当函数返回并且参考悬挂时,变量死亡。返回后,引用指向无效的内容,使用该引用会导致未定义的行为。
fu& fub() {
fu a;
fu& re = a;
return a;
// a is dead now
}
您可以通过编译器警告轻松检测到它,例如-Wall
在g ++上。
在Godbolt上直播。
,
引用引用已删除的对象。这是一个悬而未决的参考。结果,该程序具有未定义的行为。
在这种特殊情况下,输出看起来仅是正确的,因为被删除对象占用的内存尚未被覆盖。