ich folgendes, wenn ich mein Programm durch valgrind laufenValgrind: Ungültige Lese der Größe 8 Fehler
==29852== Invalid read of size 8
==29852== at 0x4EDEA50: std::_Rb_tree_increment(std::_Rb_tree_node_base const*) (in /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.21)
==29852== by 0x414EEA: std::_Rb_tree_const_iterator<std::pair... >::operator++() (stl_tree.h:284)
==29852== by 0x4268CF: Tree::removeConstantsPair(std::set...) (Tree.h:65)
==29852== by 0x4239C4: yy_reduce(yyParser*, int) (parser.y:251)
==29852== by 0x425F6D: Parse(void*, int, Token*, Tree*) (parser.c:1418)
==29852== by 0x404837: main (main.cpp:95)
Linie 65 in Tree.h ist
inline void removeConstantsPair(set<pair<string, string>>& vec){
set<string>::iterator itr;
for(auto &v : vec){ //This is line 65
itr = domainList.find(v.first);
if(itr != domainList.end())
vec.erase(v);
}
}
jedoch die Zusammenfassung Leak sagt, dass es ist keine Erinnerung, die verloren ist. Von dem, was ich verstehe, ungültiges Lesen passiert, wenn ich aus einem Speicher, der in meinem Fall freigegeben wurde lesen &vec
muss zuvor freigegeben worden sein. Mein Programm läuft und stürzt nicht ab.
Kann jemand erklären, warum es einen Gedächtnislesefehler gibt.
'std :: set :: erase()' macht den Iterator ungültig, der gelöscht wird. Was passiert, wenn ein Inkrement auf den gelöschten Iterator angewendet wird? So sieht dieser Fehlerbericht aus (wobei der Operator ++() 'verwendet wird). – PaulMcKenzie