C ++:调用Erase后,已删除的元素仍处于设置状态

时间:2013-09-16 19:14:15

标签: c++ set erase

我得到了这样的代码:

for (set<GROUP*>::iterator i = Data.m_Resulting.begin(); i != Data.m_Resulting.end();)
{
    printf("Deleting %d\n", (*i)->nId);
    Data.m_MpptPool.erase(i++);
}

printf("Remains in pool: %d\n", Data.m_MpptPool.size());

// Dump Pool:

for (set<GROUP*>::iterator i = Data.m_MpptPool.begin(); i != Data.m_MpptPool.end(); i++)
{
    printf("\t %d\n", (*i)->nId);
}

如果在删除之前集合中有2个对象,并且第一个循环删除其中一个,则.size()函数显示正确的数字(1) 但是,打印我的集内容的第二个for循环显示了那里的两个元素。后来,引用这个元素会导致分段错误。 这可能是什么问题?

2 个答案:

答案 0 :(得分:4)

您不能在另一个std::setm_Resulting)上使用一个std::setm_MpptPool)的迭代器。这是未定义的行为,您需要使用值:

Data.m_MpptPool.erase(*it++);

答案 1 :(得分:3)

您的第一个周期会重复Data.m_Resulting,但会删除Data.m_MpptPool中的元素。它使用指向前者的迭代器来删除后者中的元素。这是非法的,坦率地说,毫无意义。代码的行为未定义。你是如何期待它的?你是什​​么意思

Data.m_MpptPool.erase(i++);

当迭代器i实际指向Data.m_Resulting