![](/img/trans.png)
[英]c++11, why does this unordered_map defined for vector <int> not work?
[英]C++11 segfault on reference to unordered_map in vector
當我運行以下代碼時,在“ find()”調用上出現段錯誤。
#include <vector>
#include <unordered_map>
struct item {
std::unordered_map<int,int> map;
};
int main(int argc, char** argv) {
std::vector<item> stack;
stack.emplace_back();
std::unordered_map<int,int>& topmap=stack.back().map;
stack.emplace_back();
auto ind=topmap.find(5);
if(ind!=topmap.end()) {
printf("Found element five in second to top item\n");
}
}
(與-std = c ++ 11一起編譯)
但是,如果刪除了第二個emplace_back()調用,則不會出現段錯誤。
為什么是這樣? 我使用的參考變量有誤嗎? 將其他元素添加到堆棧中會使topmap失效嗎?
最可能的解釋是對emplace_back
的第二次調用會導致重新分配,從而使topmap
無效。 您可以通過查看stack.capacity()
輕松地進行檢查。 如果呼叫之間發生變化,則表示已重新分配。
如果您閱讀本參考資料 ,您將看到文本
如果新的
size()
大於capacity()
則所有迭代器和引用(包括過去的迭代器)都將失效。”
在向量的末尾添加新項通常會在向量內部重新分配數據,並導致此行為。 更具體地說,由於map
是結構內部的普通實例,因此它也將被重新分配。
將其他元素添加到堆棧中會使topmap失效嗎?
不是強制性的,但是可以。 這取決於在調用std::vector::emplace_back()
時是否發生了重新分配。 std :: vector :: emplace_back文檔:
如果新的size()大於Capacity(),則所有迭代器和引用(包括過去的迭代器)都將失效。 否則,只有過去的迭代器是無效的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.