2012-05-13 51 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++; ++,但 - 他們往往是相同的,但偶爾前者是大規模更有效。)