Wstawiam obiekt {string, MyStruct}
do mapy unordered_map, a następnie iteruję przez unordered_map i wybieram usunięcie elementu. Jednak przed skasowaniem elementu mam assert, który pokazuje, że unordered_map jest pusta.element unordered_map jest usuwany
To moja wkładka:
my_umap.insert(std::make_pair(key.toString(), my_struct));
Struct zawiera człon zapis czasu, w którym został wstawiony. I następnie okresowo sprawdzać mapę i usunąć elementy, które zostały w unordered_map zbyt długo:
for(auto it = my_umap.begin(); it != my_umap.end(); ++it){
MyStruct& myStruct = it->second;
const bool deleteEntry = myStruct.ts.IsElapsed(std::chrono::seconds(5));
if(deleteEntry){
const string& key = it->first; // Cannot access memory for 'key'
assert(my_umap.size() >= 1); // This is failing
my_umap.erase(key);
}
}
Używam kod w gdb i assert kończy się niepowodzeniem. Kiedy zapytania wartość od key
mówi
nie może uzyskać dostęp do pamięci
podczas kwerendy rozmiaru my_umap
mówi wielkość wynosi zero.
W jaki sposób pętla for może wykryć element, jeśli rozmiar nieuporządkowanej_mapy wynosi zero? Nie ma innych wątków uzyskujących dostęp do tego kontenera. Myślałem, że unordered_map::insert()
kopiuje obiekt do kontenera, więc oryginalny obiekt, który jest usuwany, nie powinien mieć znaczenia?
Proszę podać [mcve]. Kasowanie kontenera podczas jego iteracji wymaga jednak kłopotów. – Barry
Iterator pętli staje się niepoprawny po usunięciu i ++ robi idiotyki. –
@ ÖöTiib muszę dodać klucz do wektora, a następnie przepuścić przez to, aby usunąć? – user997112