删除参考底层

时间:2016-05-09 10:48:19

标签: c++ pointers reference

如果引用的基础变量被删除,会引用什么?

例如为什么下面的代码给出12作为输出我检查了gcc和msvc

int *x = new int(1);
int& y = *x;
delete x;
x=NULL;
int z = 12;
y=z;
cout<<"Y = "<<y<<endl;

2 个答案:

答案 0 :(得分:4)

访问已删除内存的对象是未定义的行为,无论是直接执行还是通过引用执行。

代码在GCC和MSVC上输出12的事实在很大程度上无关紧要:它可以输出1342potato,但仍然符合标准

答案 1 :(得分:0)

发布后正在访问内存。这是未定义的。 &#34;未定义&#34;并不意味着程序崩溃,甚至在不同的运行中会发生不同的事情。它只是意味着任何事情都可能发生。

可悲的是,当您访问刚刚发布的内存时,通常会发生任何不好的事情。这正是您所看到的行为。我怀疑在调试模式下在MSVC中尝试相同的操作实际上会给你一个不同的结果,因为它有一些模式,一旦它被释放就会破坏动态内存的内容。

在Linux上,尝试valgrind(查找)或地址清理程序(使用-sanitize = address编译)。两者都抓住了这种错误。