我有一个代码片段,如下所示:
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中提取更多有用信息的任何建议?