为什么引用指向释放的内存工作?

时间:2013-02-16 15:39:46

标签: c++

我尝试了下面的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)

2 个答案:

答案 0 :(得分:2)

您正在取消引用已释放的内存。这是未定义的行为。无法保证结果如何。只需将编译器,操作系统和C ++库组合在一起,该程序就可以正常运行。

这是未定义行为的一种可能结果。

答案 1 :(得分:0)

解除引用delete - 内存是未定义的行为并且没有必要找出一些模式,因为切换到另一个编译器或同一编译的另一个版本可以打破它。

delete调用非原始类型的析构函数。如果你有一个class Integer包装器在销毁时清除内容,你会看到一些区别。在原语类型上,delete不会重新初始化释放的空间。因此,您可能会看到保留原始值但这并不能保证完全正常工作,您永远不应该依赖它。