C++ 如何在解引用(C+;+;)之前检查迭代器?

C++ 如何在解引用(C+;+;)之前检查迭代器?,c++,C++,我正在使用静态分析工具查找代码中的错误。它在取消引用之前显示错误。你必须检查迭代器是否为空。我如何检查?请参阅下面的代码: for(ClientThreadGroupList_t::iterator it = m_vecClientThreadGroup.begin(); it != m_vecClientThreadGroup.end(); it++) { nCount += (*it)->ConsoleList(pSocket); //error } m_vecClientTh

我正在使用静态分析工具查找代码中的错误。它在取消引用之前显示错误。你必须检查迭代器是否为空。我如何检查?请参阅下面的代码:

for(ClientThreadGroupList_t::iterator it = m_vecClientThreadGroup.begin(); it != m_vecClientThreadGroup.end(); it++) 
{
  nCount += (*it)->ConsoleList(pSocket); //error
}
m_vecClientThreadGroup.begin()按照我的假设返回NULL ptr


您确定要使用(*it)->ConsoleList(pSocket)而不是它->ConsoleList(pSocket)?

如果满足以下条件,只需使用
进行检查:

for(ClientThreadGroupList_t::iterator it = m_vecClientThreadGroup.begin(); it != m_vecClientThreadGroup.end(); it++) 
{
    if ( (*it) != NULL ) // or in C++11 != nullptr
        nCount += (*it)->ConsoleList(pSocket); //error
}
我想是对
NULL
对象的
ConsoleList
方法的调用导致了错误。因为,如果您的
列表中没有元素,那么
开始()
将与
结束()
相同,您将永远不会进入循环

为简洁起见,您可以执行以下操作:

if ( *it ) // Implicit convertion here...

指针可以隐式转换为布尔类型,只需调用
if(*it)
即可测试指针的空值

for(ClientThreadGroupList_t::iterator it = m_vecClientThreadGroup.begin(); 
    it != m_vecClientThreadGroup.end(); ++it) 
//                                      ^^^^ // better practice
{
    if (*it)  // test if a pointer is null or not
    {
        nCount += (*it)->ConsoleList(pSocket);  
    }
}
根据评论更新:


看起来问题是多线程问题,您需要提供锁定机制,以避免另一个线程使当前迭代器无效。

检查迭代器有效性已在代码中:

it != m_vecClientThreadGroup.end()
请注意,一般来说,您无法检查迭代器是否有效或可取消引用;但是,当您在序列上迭代时,您知道迭代器在到达序列末尾之前是可解引用的

由于您的序列显然包含指针,您可能还需要在取消引用之前检查它们是否为null:

if (*it) {
    nCount += (*it)->ConsoleList(pSocket);
}

注意,这将只检查空指针;通常无法检查非空指针是否实际指向有效对象。

(*it)!=空值
或在C++11
(*it)!=nullptr
在发布之前,请注意问题预览,以确保将来代码的格式正确。除了
if
语句外,您还可以使用断言。@ddriver断言可能不会使静态分析器静音,不过,从
ClientThreadGroupList
的角度来看,这听起来像是一个糟糕的合同。我不想检查
nullptr
…不,这不是检查迭代器有效性的方式。很可能没有为迭代器定义与
0
的比较。根据
end()
正确检查迭代器本身。OP缺少的是对迭代器引用的指针的检查。只是指如果(*it!=0)嗨,我尝试了这种方法,但没有修复..它在STL的预定义部分显示错误。。从函数调用返回的指针“it.\M\u cur.”。。可能为空,并且可能被取消引用。。clientThreadgrouplist是一个dequeyes,它被多个线程使用。我想我们不能像这样检查迭代器…你仍然可以像这样检查,但你需要提供锁。防止可能导致无效迭代器的操作。
if (*it) {
    nCount += (*it)->ConsoleList(pSocket);
}