簡體   English   中英

在向量中對unordered_map的引用的C ++ 11 segfault

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

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