2011-01-12 50 views
1

請考慮下面的代碼:C++的std :: vector的內存設計缺陷,確定使用相剋pop_back()當++

vector<int> myVector; 
myVector.push_back(10); 
myVector.erase(myVector.end()); 

此代碼編譯,並在Windows(VisualStudio中),但結果運行良好在使用g ++編譯時,在Linux上的segfault中。用pop_back替換擦除解決了Linux上的問題。

有誰知道爲什麼這兩個平臺上的行爲不同,以及要考慮哪些行爲是正確的。

在此先感謝!

回答

9

end()通常在數組中返回一個無效的位置(一個超出結尾)。

pop_back()刪除矢量中的最後一項。

如果你想擦除,你必須在這裏做erase(end() - 1);end() - 1返回一個迭代器到最後一個項目。

erase(end())應該調用UB - 我認爲這是正確的......

編輯:馬丁指出,呼籲erase(end() - 1)之前,檢查向量是不是空!

+4

更優雅的恕我直言:`myVector.erase(myVector.rbegin());`,+1順便說一句。 – AraK 2011-01-12 21:04:25

0

end()指向無處,那是超越結局。

0

myVector.end()不指向矢量的最後一個元素。它指向過去該向量的最後一個元素。不過,我不確定,如果這符合未定義的行爲(如果是這樣,那麼Windows和Linux的行爲會有所不同)。

0

myVector.end()給你一個迭代器到之後你的向量中的最後一個元素。由於這裏沒有任何東西,所以在它上面調用擦除並沒有什麼意義。

我很想知道當你打電話時,Visual Studio究竟在做什麼。運行一些測試,看看它是否實際上從你的矢量中刪除10,或者它是否正在優雅地忽略你的錯誤請求。