【发布时间】:2015-02-04 16:28:23
【问题描述】:
我试图让第一款游戏类似于坦克。但是当我尝试删除敌方坦克时我的游戏崩溃了(有时有效,有时无效),我不知道我的代码有什么问题。你会帮我吗?
void Game::update(sf::Time elapsedTime){
if (enemies.size() < 6){
eTank1 = new EnemyTank(150, 130);
enemies.push_back(eTank1);
}
tank->move(elapsedTime);
for (vector<EnemyTank*>::const_iterator it = enemies.begin(); it != enemies.end();)
{
if (collision->checkCollisionWithEnemyTankAndTank(tank, *it)){
(*it)->move(elapsedTime);
}
collision->checkShoot(tank->getBulletsVector(), tank, *it);
//probably there is a problem
if ((*it)->getlife() <= 0){
delete *it;
enemies.erase(it);
cout << "TANGO DOWN" << endl;
}
++it;
}
checkShoot 看起来像这样:
void Collision::checkShoot(vector <Bullet*> &bullet, Tank *tank, EnemyTank* enemyTank){
distance = 0;
for (int i = 0; i < bullet.size(); i++){
distance = abs(bullet[i]->getPosition().x - enemyTank->getPosition().x) + abs(bullet[i]->getPosition().y - enemyTank->getPosition().y);
if (distance < 45){
cout << "act life: " << enemyTank->getlife() << endl;
enemyTank->setLife(); // -0.5 from actual life
tank->setVector(i); // delete bullet from vector
}
}
}
以及析构函数的代码
cout << "DESTRU";
delete tank_bullet;
for (auto &it : bullets){ delete it; } bullets.clear();
cout << "DESTRU T - END\n";
最后是 setVector(i);
void setVector(int index){
if (!bullets.empty()){
delete (bullets.at(index));
bullets.erase(bullets.begin() + index);
}
}
【问题讨论】:
-
谷歌“擦除删除成语”。
-
你能给我更多关于我的问题解决方案的信息吗?我不完全知道如何解决这个崩溃。谢谢。
-
@user3419495 正如 Joachim 指出的那样,您应该将擦除的返回值分配给迭代器
it = enemies.erase(it);而不是++it -
您有可能错过了@alarge 在他的回答中指出的将
++it放入else 分支的微小信息:)。您还应该考虑您的容器,因为如果元素不在向量本身的末尾,则从向量中删除是一项特别复杂的操作。但是,如果您不经常删除它可能仍然是一个不错的选择。您也可以将要删除的元素与向量的背面交换,如果元素的顺序无关紧要,只需调用pop_back()函数。
标签: c++ pointers memory-leaks sfml