当我通过valgrind运行我的程序时,我得到了以下结果。
然而,泄漏摘要表明没有丢失的内存。据我所知,如果我从已释放的内存中读取,则会发生无效的读取,因此在我的情况下,
==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)
Tree.h中的第65行是
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);
}
}
然而,泄漏摘要表明没有丢失的内存。据我所知,如果我从已释放的内存中读取,则会发生无效的读取,因此在我的情况下,
&vec
必须先被释放。尽管如此,我的程序仍然能够运行而不崩溃。有人可以解释为什么会出现内存读取错误吗?
std::set::erase()
会使被删除的迭代器失效。如果对已经被删除的迭代器进行增量操作,就会出现错误报告(使用了operator++()
)。 - PaulMcKenzie