我尝试了下面的C ++代码
#include <iostream>
using namespace std;
int main()
{
int *p = new int;
*p = 10;
int &a = *p;
delete p;
a = 20;
cout<<a<<" ";
cout<<*p;
return 0;
}
输出为:20 20
我认为这可能会因访问释放的内存或一些垃圾而导致运行时错误。可能我得到了这个输出,因为程序释放的内存位置到目前为止可能还没有被使用,所以仍然保留旧值。
所以我认为如果我不使用参考文件也应该发生
#include <iostream>
using namespace std;
int main()
{
int *p = new int;
*p = 10;
// int &a = *p;
delete p;
// a = 20;
// cout<<a;
cout<<*p;
return 0;
}
但是在这种情况下我输出为0(多次运行检查)。 Reference是否与不同的输出有关?
编译器:gcc版本4.7.2(Ubuntu / Linaro 4.7.2-2ubuntu1)
答案 0 :(得分:2)
您正在取消引用已释放的内存。这是未定义的行为。无法保证结果如何。只需将编译器,操作系统和C ++库组合在一起,该程序就可以正常运行。
这是未定义行为的一种可能结果。
答案 1 :(得分:0)
解除引用delete
- 内存是未定义的行为并且没有必要找出一些模式,因为切换到另一个编译器或同一编译的另一个版本可以打破它。
delete
调用非原始类型的析构函数。如果你有一个class Integer
包装器在销毁时清除内容,你会看到一些区别。在原语类型上,delete
不会重新初始化释放的空间。因此,您可能会看到保留原始值但这并不能保证完全正常工作,您永远不应该依赖它。