C++映射擦除错误
Error with C++ Maps erase
我不得不从c++std::map
中删除一些条目,为此,我迭代std::map
并使用擦除。但我犯了一个错误。错误如下:
0x0017f3f6 in std::_Rb_tree_rebalance_for_erase () from /usr/local/lib/libstdc++.so.6
(gdb) bt
#0 0x0017f3f6 in std::_Rb_tree_rebalance_for_erase () from /usr/local/lib/libstdc++.so.6
#1 0x00487ef4 in getLetters () from /usr/lib/libmail.so
#2 0x0048cacc in getHeader () from /usr/lib/libmail.so
#6 0x08048802 in __gxx_personality_v0 ()
#7 0x00251e9c in __libc_start_main () from /lib/libc.so.6
#8 0x080486a1 in __gxx_personality_v0 ()
(gdb)
代码是这样的:
int nlsize=LettersMap.size();
if(nlsize > MAXNL)
{
std::map <std::string,MSG_HEADER>::iterator it;
int i=0;
for( i=0, it=LettersMap.begin(); i <nlsize-MAXNL ;i++, it++)
{
LettersMap.erase(it);
}
}
有人能指出错误
您有一个iterator
到std::map
,对吗?在for
循环中,将iterator
初始化到开头。您检查它是否在范围内。然后erase
就是iterator
。您的iterator
现在无效。iterator
实际上就像指针,当你erase
时,你实际上是在delete
指向一个"指向"的值。因此,其他iterator
不能保证它们指向有效的东西。
特别是您的erase
,导致您的iterator
失效。一个有保证的,因为它是iterator
,你是erase
d。你需要一个新的iterator
,最好是在你erase
d的后面,对吧?不幸的是,std::map
没有提供这种功能。std::map
并不是真正打算作为一个顺序容器来处理的。这个想法是通过值的键而不是位置来访问值。当你试图按照它们的顺序擦除时,这是有问题的。
相反,也许你可以根据i
来确定你需要擦除哪个密钥?然后使用find
查找密钥,使用erase
擦除密钥。由于您不再按顺序迭代std::map
,因此不再需要担心无效的iterator
s。
int n = nlsize - MAXNL;
while (n-- > 0) {
LettersMap.erase(LettersMap.begin());
}
迭代器it
由于erase
而变得不稳定。
相关文章:
- 双链表的擦除值函数,未知错误
- 分割错误:向量中的擦除功能
- 编译错误 std::vector<std::shared_ptr<T>>迭代器和擦除方法
- 矢量擦除调用的错误析构函数
- 从 C++ 中的集合中擦除时出现分段错误
- 矢量擦除错误,无法删除不完整的类型
- std::map 擦除 - 将迭代器传递给错误的映射
- 删除[]是否可以与通用数组正常使用?如果是这样,为什么使用std :: vector ::擦除它会导致释放内存的错误
- 为什么这种类型的擦除实现(简化的 boost:any)会出现分段错误
- 擦除标准::列表项时的错误
- C++ 从矢量擦除时出现分割错误
- 当我在c++中擦除向量时,我遇到了双自由错误
- 地图擦除错误
- 2D 矢量中的擦除行 - 分割错误
- 擦除矢量时出现分割错误
- C++映射擦除错误
- 为什么擦除End-Iterator不会给shared_ptr分段错误
- 矢量擦除函数删除错误的对象
- 矢量擦除错误
- 从向量c++中擦除对象时出现分段错误