2010-11-22 52 views
2
&(*_shmItr) == NULL 

這是相當noob問題,但是,我新手到C++。這是無效&(* _ shmItr)== NULL其中_shmItr是一個List迭代器

在GCC 3.1.2當你檢查_shmItr == NULL是完全正常的,但作爲GCC 4.2.2 這是一個錯誤。我做了谷歌關於錯誤。他們表示解除引用和再次引用將解決問題。它做到了。當時我很開心。但是,我正在學習更多關於迭代器的知識。我覺得可能是這個傳遞錯誤,但不是有效的,會給運行時帶來問題。 什麼是你的建議,我...

我做了一些調查,發現

_shmItr == _shmItr.end() 

也有異曲同工之妙,更正確。如果我錯了,請糾正我。

基本上我們正在試圖檢查_shmItr是否持有無效的東西。在做任何操作之前。

在此先感謝。

這裏是代碼塊

_shpmtItr = _shpmtList.begin(); 

if(_shpmtItr == NULL) 
{ 
    eaLogMsg << setid("APP_FAILED") 
      << "_shpmtItr is NULL in some::few()" 
      << endl; 

    return APP_FAILURE; 
} 

這可以告訴你的情況。 static

+0

迭代器是一個不同於指針的更一般的概念。一個迭代器可以作爲一個指針來實現,但是你不應該依賴這個。 – 2010-11-22 14:16:08

回答

2

如果您要檢查是否已經傳遞到列表的末尾,請確定使用list::end。不能保證遍歷列表中的每個元素後的下一個項目都將爲NULL。它不會告訴你指針指向的項目是否有效。下面是我用list::end如果我檢查,看看我的結果的方式有效或無效:

list<whatever>::iterator item = find(myList.begin(), myList.end(), value); 
if(item != myList.end())... 

因爲find收益範圍你給它,如果沒有元素存在搜索的最後一個項目。

也就是說,當你做&(*something)你正在做的是獲取元素的地址,迭代器指向的元素是完全有效的代碼。如果您期望無效項目將爲NULL,那麼它適用於您的目的。如果你不知道它們是否爲NULL,那是另一回事。

那麼你使用什麼代碼?也許這可以幫助我們更好地回答你的問題。

編輯:你的代碼

看,看你用list::begin(),然後檢查其是否爲NULL是壞的,除非您的列表是指針列表其實我建議(或指針類似的物體,如shared_ptr)。您使用list::empty來查看列表是否爲空,而不是myList.begin() != myList.end()。這個意思很清楚,未來應該更容易維護。

相關問題