2011-05-10 116 views

回答

4

這是未定義的行爲。任何事情都可能發生。僅舉幾個選項:完全沒有,程序退出,異常,崩潰。

+1

Michiel,你沒有足夠的想象力!這裏有幾個選項:http://stackoverflow.com/questions/1553382/pod-freeing-memory-is-delete-equal-to-delete/1553407#1553407。 ':)' – sbi 2011-05-10 08:46:06

1

結果未被C++標準定義。

2

這是未定義的行爲,標準沒有說明結果。

2

這將根據C++標準(2003)調用未定義的行爲。

0

在C++標準之後,這會導致未定義的行爲(請參閱其他答案),有時候會發生currios,實際會發生什麼?

事實上,這通常不是神祕的,並且很清楚會發生什麼,但它依賴於所使用的編譯器及其版本,標準庫和編譯器標誌以及您的操作系統。 這也意味着,你絕對不應該依賴它(例如,下一個編譯器版本可能會改變行爲)。

對於你的問題(你不應該依賴於以下): 在當前的編譯器(GCC,MSVC,英特爾C++編譯器)一個std :: vector的通常(至少)兩個成員:

T* _begin_; // pointing to begin of array of vector 
T* _end_; // pointing to end(), note that array might be larger due to reserve() 

所以通常你只會得到一個超出的指針:沒有什麼意思會發生。通常,你甚至可以取消對它的引用容易(因爲數組是大於

_end_-_begin_ 

或因爲內存AFER可以通過程序來訪問。當然,內容可能是垃圾)。

如果你真的感興趣,看看彙編代碼(有優化和沒有)。