映射/迭代器增量错误
Map/iterator incremental error
以下代码抛出调试断言映射/迭代器增量错误。
void ClassA::Remove()
{
std::map<int, CVClassB*>::iterator it(m_p.begin());
while ( it != m_p.end() )
{
if (it->first >= 0)
{
m_p.erase(it);
it++;
}
}
}
你能让我知道错误是什么吗
std::map::erase
使它操作的迭代器失效。因此,之后增加它是不安全的。但是erase()
确实会为您返回下一个迭代器:
it = m_p.erase(it);
此外,你只在if
内递增it
,所以除非所有的键都>=0
,否则你会陷入无限循环。您可能想要这样的东西:
// delete all keys >= 0
if (it->first>=0) {
it = m_p.erase(it); // erase and increment
}
else {
++it; // just increment
}
另外,正如弗拉德的回答所暗示的那样,谁管理CVClassB*
的生命周期?你需要delete
吗?为什么要使用指针,您可能可以直接将值存储在地图中。(或使用智能指针)。
像这样编写循环
while ( it != m_p.end() )
{
if (it->first >= 0)
{
it = m_p.erase(it);
}
else
{
++it;
}
}
此外,您似乎应该删除擦除的迭代器指向的对象。例如
delete *it;
it = m_p.erase(it);
通过在循环内部删除来使迭代器无效,但无论如何,所做的只是清除映射。只需致电m_p.clear()
,它就会完全按照您的要求进行操作。虽然不确定你想做什么是你打算做的,但这是另一个问题。
如果要删除指向的对象,请将其删除,然后清除地图。
for(item : m_p)
delete item->second;
m_p.clear();
//done
相关文章:
- 错误 C2760:语法错误:映射迭代器上意外的标记"标识符",预期的";"
- 初始化迭代器错误 C++ 在 GCC 编译器中
- 迭代器类的重载前缀增量运算符会引发分段错误
- 为什么我在使用 istream 迭代器时会出现 seg 错误?
- 在静态库中使用输出迭代器时出现链接器错误
- 在分配和发布递增循环迭代器时C++无限循环(gcc 错误?
- 比较迭代器会使程序崩溃,而不会在自定义气泡排序实现中出现错误
- C++结构编译器错误询问向量的迭代器
- 编译时二叉搜索树错误的反向迭代器表示"no matching function call for operator=()"
- 编译错误 std::vector<std::shared_ptr<T>>迭代器和擦除方法
- 赛松迭代器错误
- 向量迭代器不兼容的错误,用于保存另一个向量的迭代器的向量
- C++,弹出调试断言失败窗口,我得到矢量迭代器不兼容的错误运行时
- 在 leveldb 的 c++ 示例中声明迭代器时出现分段错误
- std::map 擦除 - 将迭代器传递给错误的映射
- C++向量迭代器nth_element编译错误
- 如何修复错误,迭代器未在此范围内声明,并且迭代器未命名类型'
- 如何修复使用矢量和迭代器打印值的错误
- C++ 迭代器错误"does not refer to a value"
- 使用 -std=c++0x 会导致错误:“迭代器”未命名类型错误