0

我有这样的代码:

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);
}

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

4

2 回答 2

4

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

Data.m_MpptPool.erase(*it++);
于 2013-09-16T19:16:36.480 回答
3

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

Data.m_MpptPool.erase(i++);

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

于 2013-09-16T19:16:44.347 回答