C++如何删除我游戏中指针的向量

C++如何删除我游戏中指针的向量,c++,pointers,memory-leaks,sfml,C++,Pointers,Memory Leaks,Sfml,我想让第一场比赛和坦克相似。但是当我试图删除敌人的坦克时,我的游戏崩溃了,有时有效,有时无效,我不知道我的代码出了什么问题。你能帮我吗 void Game::update(sf::Time elapsedTime){ if (enemies.size() < 6){ eTank1 = new EnemyTank(150, 130); enemies.push_back(eTank1); } tank->move(elapsedTime); fo

我想让第一场比赛和坦克相似。但是当我试图删除敌人的坦克时,我的游戏崩溃了,有时有效,有时无效,我不知道我的代码出了什么问题。你能帮我吗

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;
}

}

答案确实在评论中,但如果他们觉得太简洁,我会写一个稍微长一点的解释

下面是一个与您的代码风格相似的示例:

int main() {
  auto v = std::vector<int> {1, 2, 3, 4, 5};
  for(auto it = v.cbegin(); it != v.cend(); ) {
    if(*it == 5)
      v.erase(it);
    ++it;
  }
}

除此之外,它还避免了擦除时的双增量

你不能盲目地从你正在迭代的向量开始,因为它会使迭代器失效。不过,您可能会对函数返回的内容感兴趣。Google erase remove成语。您能给我更多关于我的问题解决方案的信息吗?我不知道如何解决这个问题。谢谢。@user3419495正如Joachim所指出的,您应该将erase的返回值赋给迭代器it=Equals.eraseit;您可能错过了@alarge在其答案中指出的将++it放入else分支的微小信息,而不是++it:。您还应该考虑您的容器,因为如果元素不在向量本身的末尾,则从向量中移除尤其是一个复杂的操作。但是,如果您不经常删除,它可能仍然是一个不错的选择。此外,您还可以将要移除的元素与向量的背面交换,如果元素的顺序无关紧要,只需调用pop_back函数即可。
cout << "DESTRU";
delete tank_bullet;

for (auto &it : bullets){ delete it; } bullets.clear();


cout << "DESTRU T - END\n";
void setVector(int index){
     if (!bullets.empty()){
        delete (bullets.at(index));
        bullets.erase(bullets.begin() + index);
    }
int main() {
  auto v = std::vector<int> {1, 2, 3, 4, 5};
  for(auto it = v.cbegin(); it != v.cend(); ) {
    if(*it == 5)
      v.erase(it);
    ++it;
  }
}
if(*it == 5)
  it = v.erase(it);
else
  ++it;