2012-07-06 115 views
2

任何人都可以向我解释为什么这段代码有效(为什么它返回一个值)?引用返回奇怪值的指针

int main() 
{ 
    int *ptr = new int(113); 
    int &rPtr = *ptr; 

    delete ptr; 

    cout << rPtr << endl; 

    return 0; 
} 

基本上,这是返回值,我得到:

-572662307 
+4

你期望它做什么? – RedX 2012-07-06 21:43:29

+0

究竟是什么让你问这个问题?当人们提出这样的问题时,这意味着他们看到了与他们期望看到的不同的东西。在这种情况下你期望看到什么? – AnT 2012-07-06 21:51:42

+0

我没有看到任何东西。我刚刚得到了这个想法,如果我尝试这样的事情会发生什么,所以我试了一下,得到了奇怪的结果,所以我决定问:D – deadmau5 2012-07-06 22:00:09

回答

3

你在做什么会导致未定义的行为,所以你得到这个数字的事实是完全合理的行为。

一旦执行此序列:

int *ptr = new int(113); 
int &rPtr = *ptr; 

参考rPtr现指你与线new int(113)创建的整数。在下一行,你执行

delete ptr; 

这将删除int,这意味着对象不再存在。现在任何指针或对它的引用都会引用一个释放对象,这会导致未定义的行为。因此,当您打印rPtr

cout << rPtr << endl; 

任何事情都可能发生。在这里,你只是得到垃圾数据,但程序很容易崩溃或报告调试错误消息。有趣的是:您打印的值(-572662307),视为32位无符号值,为0xDDDDDDDD。我敢打赌,这是内存分配器将一个值放入释放内存以帮助您调试像这样的内存错误。

希望这会有所帮助!

+0

非常感谢您的回复:) – deadmau5 2012-07-09 00:24:00

0

你调用未定义行为。基准是删除指针后不再有效:

int *ptr = new int(113); 
int &rPtr = *ptr; 
//rPtr references the memory ptr points to 
delete ptr; 
//the memory is released 
//the reference is no longer valid 
cout << rPtr << endl; 
//you try to access an invalid reference 
//anything can happen at this point 
0

参考的对象为所有的块范围活着(在这种情况下,功能范围内),所以当你删除指针,一些垃圾在这个地址和输出显示它。