以下代码抛出debug assertion 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++;
}
}
}
你能否让我知道错误是什么
答案 0 :(得分:4)
std::map::erase
使操作它的迭代器无效。因此,之后增加它是不安全的。但是erase()
会为你返回下一个迭代器:
it = m_p.erase(it);
此外,您只需在it
内增加if
,因此,除非所有密钥为>=0
,否则您将获得卡在无限循环中。你可能想要这样的东西:
// delete all keys >= 0
if (it->first>=0) {
it = m_p.erase(it); // erase and increment
}
else {
++it; // just increment
}
另外,正如弗拉德的答案所暗示的那样,谁来管理CVClassB*
的生命周期?你需要delete
吗?为什么要使用指针,你可以直接将值存储在地图中。 (或使用smart pointer)。
答案 1 :(得分:1)
像
一样写循环 {"errno":-3,"code":"Z_DATA_ERROR"}
此外,您似乎应该删除已擦除迭代器指向的对象。 例如
while ( it != m_p.end() )
{
if (it->first >= 0)
{
it = m_p.erase(it);
}
else
{
++it;
}
}
答案 2 :(得分:-3)
通过在循环内部移除来使迭代器无效,但无论如何,所有这一切都清除了地图。只需致电m_p.clear()
,它就会完全按照您的要求进行操作。虽然不确定你想做什么是你打算做什么,但这是另一个问题。
如果要删除指向的对象然后删除它们,请清除地图。
for(item : m_p)
delete item->second;
m_p.clear();
//done