我初始化并插入到一个列表中,如下所示
_ARRAY_DETAIL* pAR = new _ARRAY_DETAIL;
pAR->sVar1 = 1;
pAR->nVar2 = 2;
m_SomeList.push_back(pAR);我试图从包含值1的列表中找到并删除所有的指针,然后删除我们用new创建的指针,下面的示例是否以一种好的、正确的、有效的方式完成了这两项工作?
while(Iter != m_SomeList.end());
{
if((*Iter)->sVar1 == 1)
{
_ARRAY_DETAIL* pAR = *Iter;
Iter = m_SomeList.erase(Iter);
delete pAR; pAR = NULL;
}
Iter++;
}发布于 2012-05-10 09:20:53
作为另一种选择,您可以使用remove if,尽管您所做的似乎很好。
bool IsOne (_ARRAY_DETAIL* pAR) {
if(pAR->sVar1 == 1) {
delete pAR;
return true;
}
return false;
}
remove_if (vec.begin(), vec.end(), IsOne);发布于 2012-05-10 09:02:56
一旦你删除了迭代器,它就不再有效了。您需要在擦除之前将其递增。
if((*Iter)->sVar1 == 1)
{
_ARRAY_DETAIL* pAR = *Iter;
m_SomeList.erase(Iter++);
delete pAR;
}
else
++Iter;你说erase returns an incremented iterator是正确的,但我更喜欢在擦除迭代器之前显式地做这件事。
将pAR设置为NULL是多余的,因为它无论如何都会超出下一行的范围。
还要注意,只有在if的其他部分没有递增Iter时,才应该递增它。
https://stackoverflow.com/questions/10526136
复制相似问题