我的小型笔记本电脑Linux 32位有分段故障,而我的64位窗口则没有。我不知道它是来自Qt版本,拱门还是操作系统......
无论如何,这是Valgrind发现的错误:
Invalid read of size 4 in Board::movePawns(Case*) in board.cpp:157
1: std::_List_iterator<PawnLabel*>::operator++(int) dans <a href="file:///usr/include/c++/4.8.2/bits/stl_list.h:163" >/usr/include/c++/4.8.2/bits/stl_list.h:163</a>
似乎“operator ++”导致了问题。
这是该部分的完整代码:
void Board::movePawns(Case* c)
{
int trouve = 0;
int i;
int j;
for(i=0;i<3;i++)
{
for(j=0;j<3;j++){
if(&(this->board[i][j]) == c)
break;
}
if(&(this->board[i][j]) == c)
break;
}
PawnLabel* toMove = NULL;
list<PawnLabel*>::iterator it;
list<PawnLabel*>::iterator toMove_iterator;
Case* oldCase;
for(i=0;i<3;i++)
{
for(j=0;j<3;j++){
for (it=this->board[i][j].pawnList.begin(); it != this->board[i][j].pawnList.end(); ++it)
{
if((*it)->getSelected() == 1)
{
toMove_iterator = it;
toMove = *toMove_iterator;
trouve = 1;
oldCase = &(this->board[i][j]);
}
}
}
}
toMove = *toMove_iterator;
if(trouve == 1)
{
if(oldCase == c)
{
qDebug()<<"Impossible : pion deja sur la case";
}
else
{
for(toMove_iterator;toMove_iterator != oldCase->pawnList.end();toMove_iterator++)
{
toMove = *toMove_iterator; // SOUS LINUX (OU ARCH 32 BITS ?) toMove est n'importe quoi dès la première itération
insertPawn(c,toMove);
removePawn(oldCase,toMove);
toMove->setSelected(0);
}
}
}
}
我真的不明白。我知道它搞砸了迭代器,但是我不明白为什么它在我的一台计算机上工作而不是另一台计算机。
编辑:我添加了完整的功能。
可能是我在浏览列表的同时删除了元素,但是如何正确地删除元素?