std :: map Iterator增加段错误

时间:2015-03-13 07:02:29

标签: 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);
  }
}

当我使用它时,容器的类型是std::map,并且在执行++it;时由于段错误而导致(罕见)崩溃。

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

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

可能导致崩溃的原因是什么?


其他可能有用的信息

(1)这应该是单线程代码,因此不应该并行修改地图。

(2)pred接收const std::pair<Key, Value>&所以它不应该以任何方式修改地图。

(3)当我在核心转储上运行gdb时,我得到了

(gdb) print curIt
$3 = <optimized out>
(gdb) print it
$4 = {_M_node = 0x78b80e0 <dwarf_cie_info_pool>}
(gdb) print *it
Attempt to take address of value not located in memory.

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

0 个答案:

没有答案