C++ 映射迭代器增量segfault

C++ 映射迭代器增量segfault,c++,stl,iterator,gdb,coredump,C++,Stl,Iterator,Gdb,Coredump,我有一个代码片段,如下所示: typename C::iterator it = container->begin(); while (it != container->end()) { typename C::iterator curIt = it; ++it; if (!pred(*curIt)) { container->erase(curIt); } } 0x0000000000b0f000 in operator++ (this=<sy

我有一个代码片段,如下所示:

typename C::iterator it = container->begin();
while (it != container->end()) {
  typename C::iterator curIt = it;
  ++it;
  if (!pred(*curIt)) {
    container->erase(curIt);
  }
}
0x0000000000b0f000 in operator++ (this=<synthetic pointer>) at ..../libgcc/4.8.1/gcc-4.8.1-glibc-2.17-fb/8aac7fc/include/c++/4.8.1/bits/stl_tree.h:189
当我使用它时,容器的类型是
std::map
,当
++它时,由于segfault,我得到一个(罕见的)崩溃被执行

堆栈跟踪的相关部分如下所示:

typename C::iterator it = container->begin();
while (it != container->end()) {
  typename C::iterator curIt = it;
  ++it;
  if (!pred(*curIt)) {
    container->erase(curIt);
  }
}
0x0000000000b0f000 in operator++ (this=<synthetic pointer>) at ..../libgcc/4.8.1/gcc-4.8.1-glibc-2.17-fb/8aac7fc/include/c++/4.8.1/bits/stl_tree.h:189

我如何解释这一点以及如何从gdb中提取更多有用信息的建议?

@TonyD-Hmm,实际上,这可能是实现中的一些问题。我认为关联容器的
erase()
不允许使结束迭代器无效。您能提供一个可以按原样粘贴的完整示例吗?@t.C.是的-很好-在兼容的实现中
erase()
不允许使
end()的早期快照无效
…@vigs1990
\u GLIBCXX\u DEBUG
将libstdc++置于调试模式。请看,我研究了libstdc++的实现,它的设计保证了最终迭代器将按照标准的要求保持有效。由于这段代码写的是正确的,我倾向于认为问题一定在其他地方。可能是某个地方的内存损坏错误。