segfault,同时使用QT-C++在同一游戏中查找Same
segfault while finding sames in Same Game using QT-C++
我正在努力学习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
函数,后者将尝试删除它。
在迭代容器时向容器添加或从容器中删除不是一个好主意。这会使迭代器无效。任何事情都有可能发生。
相关文章:
- 正在查找文档以获得PS4平台的C++中的设备信息
- 在C++中查找文件
- 模板元程序查找相似的连续类型名称
- 在UNIX系统中使用DIR查找文件的字节大小
- 查找最接近的大于当前数字的数字的索引
- 有没有一种方法可以创建一个带有哈希表的数据库,该哈希表具有恒定时间查找功能
- 查找后更改类变量
- 使用正则表达式regex_search在字符串中查找字符串
- 使用gcc从静态链接的文件中查找可选符号
- 在C++中查找范围的长度
- 算法问题:查找从堆栈中弹出的所有序列
- 在C++游戏中与库存系统作斗争
- 在Windows中查找扬声器输出的当前音量级别
- 如何在C++中使用X509证书模在令牌中查找私钥
- 使用.find函数在c++中查找字符和另一个字符之间的大小
- 如何在虚幻编辑器内容浏览器中查找虚幻游戏模式
- 为游戏制作地址查找器
- 找到一种正确"(快速而准确)的方式来查找检查 2D 游戏碰撞的内容。C++
- 在网格细胞游戏中查找子弹轨迹上的所有细胞
- segfault,同时使用QT-C++在同一游戏中查找Same