我的代码如下:
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”。
为什么我能得到这个结果?
答案 0 :(得分:2)
像struct ABC
这样的POD类型的析构函数可能是无操作。
做你正在做的事情是错误的,但它碰巧是有效的,因为破坏并没有做任何事情;由于堆栈重叠而导致数据被覆盖,数据将会丢失,但在此之前,具有相同数据的内存仍然存在。不要依赖于此(你已经知道它错了),但是它完全符合你的期望,从被调用函数的(现在放弃的)堆栈帧复制之前它被覆盖了后续电话。
答案 1 :(得分:1)
根据C ++标准,功能:
struct ABC& myfun(void) {
struct ABC
x ={ "Lining",99 };
return x;
}
是合法的。如果另一个函数调用此函数并尝试使用结果,则只会是未定义的行为。不允许编译器拒绝不尝试使用结果的程序。
事实上,只有当编译器能够证明执行总是达到使用结果的尝试时,才能拒绝该程序。对于您的特定程序,编译器可以执行此操作,但编译器编写者选择不执行该特定分析。