簡體   English   中英

C ++ std :: vector segfault在使用delete()時使用,在pop_back()與g ++一起使用時可以

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM