1

想象一下我有这个结构

struct datalist {
    int index;
    int number;
};

使用我们正在使用的结构,我们将使用一个列表

while(Iter != m_SomeList.end());
{
    if(*Iter) 
    {
        //do something

        Iter++;
    }
    else   //Iterator is NULL so can we erase it from the list like so?
    {
        datalist* pAR = *Iter;
        Iter = m_SomeList.erase(Iter);
        delete  pAR;    pAR = NULL;
    }
}

所以基本上问题是,如果它们是 NULL,我们可以从列表中删除和擦除空/无效的迭代器吗?

4

2 回答 2

6

如果您有一个指针列表,则可以更轻松地删除空指针:

std::list<datalist*> m_SomeList = /* ... */;
m_SomeList.remove(NULL);

显然没有必要调用delete,因为指针已经没有指向任何地方。

另一方面,将擦除逻辑与将指针设置为 NULL 的程序的其他部分(您没有向我们展示)结合起来可能会更有成效。

于 2012-05-13T20:42:40.340 回答
1

假设Iter是 a list<datalist *>::iterator,那么是的,你可以。

你不需要 delete pAR,因为你知道它是空的,但是这样做是允许的(它没有效果)。您已经以正确的方式编写了循环来处理擦除。

++Iter;(尽管你不应该总是用Iter++;C++ 编写——它们通常是相同的,但有时前者效率更高。)

于 2012-05-13T20:42:44.223 回答