C++ 为什么我可以在VS2015中返回对局部结构变量的引用?

C++ 为什么我可以在VS2015中返回对局部结构变量的引用?,c++,struct,return,C++,Struct,Return,我的代码如下: #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 %d\n", y.na

我的代码如下:

#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 %d\n", y.name, y.n);
    return 0;
}
这里我调用了
myfun()
,它返回对本地
struct ABC
变量的引用。这应该是错误的,因为在
myfun()
返回后,它使用的内存将不再可用。但该代码在VS2015中运行良好,并将正确的信息打印为“Lining 99”


为什么我能得到这个结果?

对于像您的
结构ABC
这样的POD类型,析构函数可能是不可操作的


做你正在做的事情是错误的,但它碰巧起作用,因为破坏什么都不起作用;当数据被覆盖时,由于堆栈重新增长,数据将丢失,但在此之前,具有相同数据的内存仍然存在。不要依赖于此(您已经知道它是错误的),但它正在做您所期望的事情,在被后续调用覆盖之前,从被调用函数的(现在已放弃)堆栈帧进行复制。

类似于您的
结构ABC
的POD类型的析构函数可能是不可操作的


做你正在做的事情是错误的,但它碰巧起作用,因为破坏什么都不起作用;当数据被覆盖时,由于堆栈重新增长,数据将丢失,但在此之前,具有相同数据的内存仍然存在。不要依赖于这个(你已经知道它是错误的),但是它正是你所期望的,从被调用函数的(现在放弃的)堆栈帧复制,然后被后续调用覆盖。

< P>根据C++标准,函数:

struct ABC& myfun(void) {
    struct ABC
    x ={ "Lining",99 };
    return x;
}
这是合法的。只有当另一个函数调用此函数并尝试使用结果时,才是未定义的行为。编译器不允许拒绝不尝试使用结果的程序


事实上,只有当编译器能够证明执行总是达到使用结果的尝试时,程序才能被拒绝。对于特定的程序,编译器可以这样做,但是编译器的作者选择不执行那个特定的分析。

< P>根据C++标准,函数:

struct ABC& myfun(void) {
    struct ABC
    x ={ "Lining",99 };
    return x;
}
这是合法的。只有当另一个函数调用此函数并尝试使用结果时,才是未定义的行为。编译器不允许拒绝不尝试使用结果的程序

事实上,只有当编译器能够证明执行总是达到使用结果的尝试时,程序才能被拒绝。对于您的特定程序,编译器可以这样做,但编译器编写者选择不执行该特定分析