2012-05-13 52 views
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?

+0

纠正我,如果我错了,但不会将您的测试确定Iter是否为空(* Iter)如果Iter实际上是空的,则引用空指针? – Greg

+0

你似乎有一个指针列表。这本身就不好,但它也使'delete'调用完全没有意义。 –

回答

6

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

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

有明显不需要调用delete,因为指针已经不指向任何地方。

另一方面,将擦除逻辑与程序的另一部分(您未显示给我们)将指针设置为NULL可能会更有成效。

+0

不错 - 我从来不知道'list'有一个专门的'remove'! –

1

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

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

(你应该总是写++Iter;用C不Iter++; ++,但 - 他们往往是相同的,但偶尔前者是大规模更有效。)