我得到了这样的代码:
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循环显示了那里的两个元素。后来,引用这个元素会导致分段错误。 这可能是什么问题?
答案 0 :(得分:4)
您不能在另一个std::set
(m_Resulting
)上使用一个std::set
(m_MpptPool
)的迭代器。这是未定义的行为,您需要使用值:
Data.m_MpptPool.erase(*it++);
答案 1 :(得分:3)
您的第一个周期会重复Data.m_Resulting
,但会删除Data.m_MpptPool
中的元素。它使用指向前者的迭代器来删除后者中的元素。这是非法的,坦率地说,毫无意义。代码的行为未定义。你是如何期待它的?你是什么意思
Data.m_MpptPool.erase(i++);
当迭代器i
实际指向Data.m_Resulting
?