【发布时间】:2016-06-05 02:30:42
【问题描述】:
当我通过 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++())。
标签: c++ c++11 memory-management valgrind