0

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

for(ClientThreadGroupList_t::iterator it = m_vecClientThreadGroup.begin(); it != m_vecClientThreadGroup.end(); it++) 
{
  nCount += (*it)->ConsoleList(pSocket); //error
}
4

4 回答 4

5

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

it != m_vecClientThreadGroup.end()

请注意,通常,您无法检查迭代器是否有效或可取消引用。但是,当您迭代一个序列时,您知道迭代器将是可解引用的,直到您到达序列的末尾。

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

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

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

于 2013-07-29T11:08:53.947 回答
1

指针可以隐式转换为布尔类型,只需调用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);  
    }
}

从评论更新:

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

于 2013-07-29T10:37:28.347 回答
1
for(ClientThreadGroupList_t::iterator it = m_vecClientThreadGroup.begin(); it != m_vecClientThreadGroup.end(); it++) {
if (*it != 0)
   nCount += (*it)->ConsoleList(pSocket); //error    
}

m_vecClientThreadGroup.begin() 像我想的那样返回 NULL ptr

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

于 2013-07-29T10:28:58.097 回答
0

你可以简单地用一个if条件检查它:

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
}

ConsoleList我认为是对对象的方法调用NULL导致了错误。list因为,如果您的,中没有元素,begin()end()与您将永远不会进入循环。

为简洁起见,您可以这样做:

if ( *it ) // Implicit convertion here...
于 2013-07-29T10:30:05.580 回答