2010-11-22 48 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()。这个意思很清楚,未来应该更容易维护。

相关问题