segfault,同时使用QT-C++在同一游戏中查找Same

segfault while finding sames in Same Game using QT-C++

本文关键字:游戏 查找 Same QT-C++ segfault      更新时间:2023-10-16

我正在努力学习QT,在学习的同时,我想开发一款相同的游戏。我有一个QGraphicsItem的子类,它是GemQGraphicsScene whics的一个子类是GameScene。

我将场景中每个宝石的点击OnMe信号连接到GameScene的点击插槽。Signal提供指向单击对象的指针。GameScene类包含指向其中宝石的指针列表。

到目前为止,我只尝试过删除相同的东西,而没有替换任何宝石。当我运行游戏并点击一个宝石时,它有时效果很好,会删除所有相同的宝石,有时还会出现分段错误。我不明白我的问题在哪里。

void GameScreen::clicked(Gem *cGem){
// cGem is the clicked gem
if(cGem)
{
 //find cGem in the list and erase from list
    QList<Gem*>::Iterator i = gems->begin();
    for(; i != gems->end(); ++i)
    {
        if(*(*i) == *cGem)
        {
            gems->erase(i);
            break;
        }
    }
    // end of erasing
QList<Gem*> neighbours;
    for(i=gems->begin(); i != gems->end(); ++i)
    {
        if((*i) && (*i)->doesItTouch(cGem) && (*i)->getColor() == cGem->getColor())
            neighbours.append(*i);
    }
    delete cGem;
    while(!neighbours.isEmpty())
    {
        clicked(neighbours.first());
        neighbours.removeFirst();
    }
}
return;

}

这是Gem::doesItTouch(Gem*oGem)

if(oGem)
    return (qAbs(x - oGem->getX()) + qAbs(y - oGem->getY())) <= 1;
return false;

想象一下这样一种情况:你有一个宝石(x),它的右边(a)和下面(b)有一个邻居。

--xa--
--bc--

现在,当它遍历neighbours列表时,假设它将其右侧的邻居(a)传递给clicked函数。现在,如果这个gem下面有一个邻居(c),它将把它传递给clicked函数。现在您所处的情况是,这个宝石左侧(b)的宝石与第一个宝石(x)下方的宝石相同。这将删除该gem,但它仍将在第一个gem(x)的neighbours列表中,这是一个无效指针,它将把它传递给clicked函数,后者将尝试删除它。

在迭代容器时向容器添加或从容器中删除不是一个好主意。这会使迭代器无效。任何事情都有可能发生。