假設你有一個隨機訪問迭代器(如性病::向量的myVector)C++迭代器+整數當迭代器結束時的結果是什麼?
時ITER + someInt是過去式末端迭代器, ITER + someInt == myVector.end()?
或者它可能是不同於myVector.end()的值?
假設你有一個隨機訪問迭代器(如性病::向量的myVector)C++迭代器+整數當迭代器結束時的結果是什麼?
時ITER + someInt是過去式末端迭代器, ITER + someInt == myVector.end()?
或者它可能是不同於myVector.end()的值?
這是未定義的行爲。任何事情都可能發生。僅舉幾個選項:完全沒有,程序退出,異常,崩潰。
結果未被C++標準定義。
這是未定義的行爲,標準沒有說明結果。
這將根據C++標準(2003)調用未定義的行爲。
在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可以通過程序來訪問。當然,內容可能是垃圾)。
如果你真的感興趣,看看彙編代碼(有優化和沒有)。
Michiel,你沒有足夠的想象力!這裏有幾個選項:http://stackoverflow.com/questions/1553382/pod-freeing-memory-is-delete-equal-to-delete/1553407#1553407。 ':)' – sbi 2011-05-10 08:46:06