为什么我可以在VS2015中返回对本地struct变量的引用?

时间:2016-01-21 02:56:28

标签: c++ struct return

我的代码如下:

mysql --user=[MyUser] --password=[Mypassword] --database=[mydbname] --execute="Query Here"

这里我调用#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返回后,它使用的内存将不再服务。但是这个代码在VS2015中运行良好,并将正确的信息打印为“Lining 99”。

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

2 个答案:

答案 0 :(得分:2)

struct ABC这样的POD类型的析构函数可能是无操作。

做你正在做的事情是错误的,但它碰巧是有效的,因为破坏并没有做任何事情;由于堆栈重叠而导致数据被覆盖,数据将会丢失,但在此之前,具有相同数据的内存仍然存在。不要依赖于此(你已经知道它错了),但是它完全符合你的期望,从被调用函数的(现在放弃的)堆栈帧复制之前它被覆盖了后续电话。

答案 1 :(得分:1)

根据C ++标准,功能:

struct ABC& myfun(void) {
    struct ABC
    x ={ "Lining",99 };
    return x;
}

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

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