2012-10-05 65 views
1

我是新來的C++後有效跑進以下據稱錯誤,但不知何故,我的計劃只是工程.. 下面是代碼爲什麼排隊的返回值:前()隊列:: pop()方法

#include<iostream> 
#include<queue> 
#include <string> 


int main() 
{ 
string s ("cat"); 
queue<string> _queue; 
_queue.push(s); 
string & s1 = _queue.front(); 
_queue.pop(); 
// at this time s1 should become invalid as pop called destructor on s 
std::cout << s1 << std::endl; 
return 0; 

} 

它只是起作用,即使s1是對無效對象的引用。有沒有一種方法可以斷言s1真正指向一個無效的對象?

+2

這是教科書[未定義行爲](http://en.wikipedia.org/wiki/Undefined_behavior),根據定義,它在運行時不是「可檢測的」,因爲您已經在UB-land中。 – ildjarn

+0

Ty爲與UB建立良好關係。 – Jimm

+0

請參見[局域變量的內存是否可以在其範圍之外訪問?](http://stackoverflow.com/a/6445794/597607) –

回答

5

嘗試訪問被破壞的對象的方式在代碼中執行的方式會導致未定義的行爲。不,沒有語言提供的方式來執行這種情況的運行時檢查。確保你的代碼中不會發生類似這樣的事情完全是你的責任。

在實驗中「It just works」的事實只是一個意外(像往常一樣具有一定程度的典型計算機決定論)。完全不相關的東西可能會在你的程序中發生變化,並且這段代碼將不再「工作」。

+0

稍有關係,即使內存從未被訪問過,它是UB嗎?一個自定義分配器有一個方法來聲明一個指針的有效性?通常沒有用,但可以用於測試。 –

+0

想知道爲什麼C++運行時不會將已釋放的內存清零? – Jimm

+0

@Jimm:有些實現可以,它依賴於分配器。但是,爲什麼它需要?這給了什麼好處?任何依賴該代碼的代碼都有bug。 – ildjarn