这是无效&(* _ shmItr)== NULL其中_shmItr是List迭代器

时间:2010-11-22 13:55:10

标签: c++ stl

&(*_shmItr) == NULL

这是一个非常古怪的问题但是,我是C ++的新手。

在GCC 3.1.2中检查_shmItr == NULL完全正常,但是作为GCC 4.2.2 这是一个错误。我确实谷歌关于错误。他们说再次引用和引用将解决问题。它做到了。当时我很开心。但随着我对iterator的了解越来越多。我觉得这可能是传递错误,但无效并且可以给运行时问题。 你对我有什么建议......

我做了很少的研究,发现

_shmItr == _shmItr.end()

也有同样的目的,更正确。如果我错了,请纠正我。

基本上我们试图检查_shmItr是否持有无效的东西。在做任何操作之前。

提前致谢。

这是代码块

_shpmtItr = _shpmtList.begin();

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

   return APP_FAILURE;
}

这可以告诉你这个场景。 静态

1 个答案:

答案 0 :(得分: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()然后检查它是不好的,除非你的列表是一个指针列表(或像shared_ptr这样的对象的指针。)我实际上建议您使用list::empty查看列表是否为空而不是myList.begin() != myList.end()。其含义非常明确,将来应该更容易维护。