我正在使用静态分析工具来查找代码中的错误。它在取消引用之前显示错误,您必须检查您的迭代器是否为 NULL。我该如何检查?请看下面的代码:
for(ClientThreadGroupList_t::iterator it = m_vecClientThreadGroup.begin(); it != m_vecClientThreadGroup.end(); it++)
{
nCount += (*it)->ConsoleList(pSocket); //error
}
我正在使用静态分析工具来查找代码中的错误。它在取消引用之前显示错误,您必须检查您的迭代器是否为 NULL。我该如何检查?请看下面的代码:
for(ClientThreadGroupList_t::iterator it = m_vecClientThreadGroup.begin(); it != m_vecClientThreadGroup.end(); it++)
{
nCount += (*it)->ConsoleList(pSocket); //error
}
检查迭代器有效性已经在您的代码中:
it != m_vecClientThreadGroup.end()
请注意,通常,您无法检查迭代器是否有效或可取消引用。但是,当您迭代一个序列时,您知道迭代器将是可解引用的,直到您到达序列的末尾。
由于您的序列显然包含指针,因此您可能还需要在取消引用之前检查它们是否为空:
if (*it) {
nCount += (*it)->ConsoleList(pSocket);
}
请注意,这只会检查空指针;您通常无法检查非空指针是否实际上指向有效对象。
指针可以隐式转换为布尔类型,只需调用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);
}
}
从评论更新:
看起来问题是多线程问题,您需要提供锁定机制以避免另一个线程使您当前的迭代器无效。
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)?
你可以简单地用一个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...