Map / iterator增量错误

时间:2016-02-24 09:32:37

标签: c++ c++11

以下代码抛出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++;
        }   
    }
}

你能否让我知道错误是什么

3 个答案:

答案 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