2013-02-16 33 views
1

我试图以下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)

+5

这是未定义的行为。 – sgarizvi 2013-02-16 15:40:12

+4

它似乎工作,就是这样。你违反规定。 – 2013-02-16 15:41:59

+0

好吧,没有提供第一组输出为20的参考连接。 – user2078670 2013-02-16 15:54:46

回答

0

提领delete -d内存未定义行为,有没有点搞清楚一些模式如切换到另一个编译器或相同的编译的另一个版本可以打破它。

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

2

您提领释放内存。这是未定义的行为。无法保证结果会是什么。它只是发生在你的编译器,操作系统和C++库的组合中,程序似乎工作。

这是不确定的行为一个可能的结果。

相关问题