如果引用的基础变量被删除,会引用什么?
例如为什么下面的代码给出12作为输出我检查了gcc和msvc
int *x = new int(1);
int& y = *x;
delete x;
x=NULL;
int z = 12;
y=z;
cout<<"Y = "<<y<<endl;
答案 0 :(得分:4)
访问已删除内存的对象是未定义的行为,无论是直接执行还是通过引用执行。
代码在GCC和MSVC上输出12
的事实在很大程度上无关紧要:它可以输出13
,42
或potato
,但仍然符合标准
答案 1 :(得分:0)
发布后正在访问内存。这是未定义的。 &#34;未定义&#34;并不意味着程序崩溃,甚至在不同的运行中会发生不同的事情。它只是意味着任何事情都可能发生。
可悲的是,当您访问刚刚发布的内存时,通常会发生任何不好的事情。这正是您所看到的行为。我怀疑在调试模式下在MSVC中尝试相同的操作实际上会给你一个不同的结果,因为它有一些模式,一旦它被释放就会破坏动态内存的内容。
在Linux上,尝试valgrind(查找)或地址清理程序(使用-sanitize = address编译)。两者都抓住了这种错误。