为什么我可以 return local int& 并获得一定的价值而不是垃圾? C++
Why can I return local int& and get certain value instead of trash? C++
我想知道当你 return int& 时会发生什么。让我们跳到这个例子。
我有一个简单的 class Foobar 存储一个整数。
让我们看看这个函数:
Foobar showObjectsValue() {
Foobar b(50);
return b;
}
它 return 是一个本地对象的副本,所以当我调用这个函数时,我实际上得到了一些数据而不是一些垃圾。但是当我做这样的事情时:
Foobar& showObjectsValue() {
Foobar b(50);
return b;
}
它 return 是垃圾,因为在我们退出 "showObjectsValue()" 对象的作用域后 "b" 从内存堆栈中弹出并且我们 return 引用这个弹出的对象(如果我错了请纠正我)。但是我不知道在 returning int 而不是 object 的情况下会发生什么。
这个函数:
int& showIntegerValue() {
int i = 50;
return i;
}
和这个函数:
int showIntegerValue() {
int i = 50;
return i;
}
return 相同的值,都给我 int = 50。那么有人可以解释在 return 引用本地整数和本地对象的情况下实际发生了什么吗?
So can someone explain what actually is going on in case of returning reference to local integer and local object?
整数是对象。尝试访问已销毁对象的别名是未定义的行为。不要对它抱有任何期望。你的编译器甚至应该给你一个警告:
main.cpp:4:9: warning: reference to local variable 'i' returned [-Wreturn-local-addr]
int i = 50;
最后,当你处理未定义的行为时,仅仅因为你看到某些东西并不意味着它是预期的。为了进一步证明这一点,尝试使用 GCC 运行 这段代码会导致上面的警告和分段错误。
我想知道当你 return int& 时会发生什么。让我们跳到这个例子。 我有一个简单的 class Foobar 存储一个整数。 让我们看看这个函数:
Foobar showObjectsValue() {
Foobar b(50);
return b;
}
它 return 是一个本地对象的副本,所以当我调用这个函数时,我实际上得到了一些数据而不是一些垃圾。但是当我做这样的事情时:
Foobar& showObjectsValue() {
Foobar b(50);
return b;
}
它 return 是垃圾,因为在我们退出 "showObjectsValue()" 对象的作用域后 "b" 从内存堆栈中弹出并且我们 return 引用这个弹出的对象(如果我错了请纠正我)。但是我不知道在 returning int 而不是 object 的情况下会发生什么。
这个函数:
int& showIntegerValue() {
int i = 50;
return i;
}
和这个函数:
int showIntegerValue() {
int i = 50;
return i;
}
return 相同的值,都给我 int = 50。那么有人可以解释在 return 引用本地整数和本地对象的情况下实际发生了什么吗?
So can someone explain what actually is going on in case of returning reference to local integer and local object?
整数是对象。尝试访问已销毁对象的别名是未定义的行为。不要对它抱有任何期望。你的编译器甚至应该给你一个警告:
main.cpp:4:9: warning: reference to local variable 'i' returned [-Wreturn-local-addr]
int i = 50;
最后,当你处理未定义的行为时,仅仅因为你看到某些东西并不意味着它是预期的。为了进一步证明这一点,尝试使用 GCC 运行 这段代码会导致上面的警告和分段错误。