什麼導致此代碼崩潰?我試着用-fsanitize = address編譯它,得到了==9347==ERROR: AddressSanitizer: heap-use-after-free on address 0x61500000fdb4 at pc 0x00010a4f1043 bp 0x7fff55710b70 sp 0x7fff55710b68
。當我的電腦上x == 0和y == 22時,它在vec.push_back(x + y)
上失敗。基於範圍的循環和std :: vector.push_back()崩潰程序
回答
如果新的大小()比容量大(),那麼所有的迭代器和引用(包括過去的最末端迭代器)無效。否則只有最後一個迭代器失效。
基於範圍的循環在內部使用迭代器。使用push_back
可能會導致這些迭代器失效。
編輯:請注意,當y == 22
您插入第65個元素到您的向量。容量有可能是64.許多實現方式的容量增加2次方(每次增加一倍)。
一旦你調用std::vector::push_back
或與此有關的迭代器失效最non-const
功能(當新的大小超過這將導致存儲在內部重新分配的向量的當前容量)
你可以找到一些一般的標準容器或迭代器是如何工作的很好的參考。我希望你能開始!
有一些非const方法,永遠不會使迭代器失效。例如[std :: vector :: pop_back](http://en.cppreference.com/w/cpp/container/vector/pop_back)或[std :: vector :: back](http://en.cppreference的.com /瓦特/ CPP /容器/載體/背面)。 –
@FrançoisAndrieux或std :: vector :: data。儘管在我看來這是一條很好的經驗法則。大多數非const方法除了直接引用數據的方法外。 – user2176127
- 1. 基於範圍的循環std ::隊列
- 2. 基於範圍的循環
- 3. 基於範圍的循環
- 4. 如何使用基於範圍的for()循環與std :: map?
- 5. 基於範圍的循環C++ 11用於範圍(L,R)
- 6. 基於範圍的C++循環
- 7. C++中基於範圍的循環
- 8. 基於Django模板範圍的循環
- 9. 基於範圍循環工作的範圍
- 10. 基於範圍的循環中未命名的循環變量?
- 11. &&,基於範圍的循環和臨時工作是怎樣的?
- 12. 基於範圍的多維std :: array
- 13. std :: list循環永遠,範圍問題?
- 14. 雖然循環使程序崩潰
- 15. 執行while循環後程序崩潰
- 16. C程序在For循環崩潰
- 17. 基於循環的範圍和消除運行時錯誤
- 18. 基於範圍的循環和內聯函數
- 19. 範圍崩潰的子串
- 20. 對於循環崩潰我的android應用程序
- 21. 將範圍基於循環在C++保留索引順序
- 22. For循環和範圍
- 23. 使用基於範圍的循環的錯誤 - Eclipse CDT Luna
- 24. 對於基於循環的範圍,cbegin/cend不夠嗎?
- 25. For循環崩潰
- 26. 範圍-for循環和std :: vector的<bool>
- 27. 在C++中使用基於範圍的循環
- 28. 使用基於範圍的循環在子範圍上進行迭代
- 29. 循環遍歷範圍以基於範圍內的值填充座標
- 30. 使用OpenMP與C++ 11基於範圍的for循環?
做一個push_back是UB在循環的任何範圍內還是在循環的內部嵌套範圍內? (你的回答讓我相信「任何範圍的循環」,但這將是一個這樣的陷阱) – user
@user你不能做任何使迭代器無效到你正在使用基於範圍for循環迭代的向量。無效的規則非常明確。例如,你可以在循環內部使用'push_back',以確保size()不會超過'capacity()'(例如,通過使用'reserve()'來提前提高容量)。查看[std :: vector](http://en.cppreference.com/w/cpp/container/vector)的方法頁面,瞭解詳細的失效規則。是的,這是相當的陷阱! –
謝謝你的精度 – user