&(*_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;
}
这可以告诉你这个场景。 静态
答案 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()
。其含义非常明确,将来应该更容易维护。