我的代码如下:
#include "stdio.h"
#include "string.h"
struct ABC {
char name[20];
int n;
};
struct ABC& myfun(void) {
struct ABC
x ={ "Lining",99 };
return x;
}
int main(void) {
struct ABC y = myfun();
printf("%s %dn", y.name, y.n);
return 0;
}
这里我调用了 myfun()
,它返回对局部struct ABC
变量的引用。这应该是错误的,因为在myfun()
返回后,它使用的内存将不再服务。但是此代码在VS2015中运行良好,并将正确的信息打印为"Lining 99"。
为什么我可以得到这个结果?
像你的 struct ABC
这样的 POD 类型的析构函数很可能是无操作的。
你正在做的事情是错误的,但它碰巧有效,因为破坏不会做任何事情;当它被覆盖时,由于堆栈重新增长,数据将丢失,但在此之前,具有相同数据的内存仍然存在。不要依赖这个(你已经知道它是错误的),但它正在做你所期望的,在被调用函数被覆盖之前从被调用函数的(现已放弃)堆栈帧复制。
根据C++标准,函数:
struct ABC& myfun(void) {
struct ABC
x ={ "Lining",99 };
return x;
}
是合法的。只有当另一个函数调用此函数并尝试使用结果时,它才是未定义的行为。 不允许编译器拒绝不尝试使用结果的程序。
事实上,只有当编译器能够证明执行总是到达使用结果的尝试时,才能拒绝程序。 对于您的特定程序,编译器可以执行此操作,但编译器编写者选择不执行该特定分析。