[英]C++ std::vector segfault when using erase(), ok when using pop_back() with g++
請考慮以下代碼:
vector<int> myVector;
myVector.push_back(10);
myVector.erase(myVector.end());
該代碼可以在Windows(VisualStudio)上編譯並正常運行,但是使用g ++進行編譯時會在Linux上產生段錯誤。 用pop_back替換擦除可解決Linux上的問題。
有誰知道為什么這兩種平台上的行為不同,以及什么行為可以糾正。
提前致謝!
end()
通常會在數組中返回無效位置(超出末尾的位置)。
pop_back()
刪除向量中的最后一項。
如果要擦除,則必須erase(end() - 1);
在這里end() - 1
將迭代器返回到最后一項。
erase(end())
應該調用UB-我認為是正確的...
編輯:正如馬丁指出的那樣,在調用erase(end() - 1)
,請檢查向量是否為空!
end()
指向無處,那是無盡的。
myVector.end()
不指向向量的最后一個元素。 它指出過去的向量的最后一個元素。 但是,我不確定這是否屬於未定義的行為(如果確實如此,則Windows和Linux行為不同是合理的)。
myVector.end()
為您提供一個迭代器,使您可以在向量中的最后一個元素之后進行迭代。 由於那里沒有任何東西,因此對其進行呼叫擦除沒有多大意義。
我很好奇地想確切地知道當您調用Visual Studio時在做什么。 運行一些測試,以查看它是否實際上已從引導程序中擦除10
,或者只是從容地忽略了您的錯誤請求。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.