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



我的代码如下:

#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;
}

是合法的。只有当另一个函数调用此函数并尝试使用结果时,它才是未定义的行为。 不允许编译器拒绝不尝试使用结果的程序。

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

最新更新