C++ 向量擦除过程中的分段错误

C++ 向量擦除过程中的分段错误,c++,vector,erase,fault,C++,Vector,Erase,Fault,我正在开发一个小行星游戏克隆,但在删除小行星矢量中的元素时遇到了一个问题。所以一般来说,当我撞击小行星时,它应该分成3部分。所以我创建了3个新的小行星,删除了旧的一个,然后它崩溃了 void Level::missleAsteroidCollision(){ std::cout<<this->asteroidVector.size()<<std::endl; for(auto ptr = this->missleVector.begin();p

我正在开发一个小行星游戏克隆,但在删除小行星矢量中的元素时遇到了一个问题。所以一般来说,当我撞击小行星时,它应该分成3部分。所以我创建了3个新的小行星,删除了旧的一个,然后它崩溃了

void Level::missleAsteroidCollision(){
    std::cout<<this->asteroidVector.size()<<std::endl;
    for(auto ptr = this->missleVector.begin();ptr!=this->missleVector.end();++ptr){
            sf::FloatRect missleBounds = (*ptr)->shape.getGlobalBounds();
            for(auto ptrTwo = this->asteroidVector.begin(); ptrTwo!= this->asteroidVector.end();++ptrTwo){
                if(missleBounds.intersects((*ptrTwo)->shape.getBounds()) && (*ptrTwo)->isFinalForm == false){
                    for(int i = 0; i < 3; ++i){
                        this->createAsteroid((*ptrTwo)->origin,true);
                    }
                    delete *ptrTwo;
                    this->asteroidVector.erase(ptrTwo);
                }
                else if(missleBounds.intersects((*ptrTwo)->shape.getBounds()) && (*ptrTwo)->isFinalForm == true){
                    delete *ptrTwo;
                    this->asteroidVector.erase(ptrTwo);
                }
            }
    }
}
void级别::missleAsteroidCollision(){
std::coutshape.getGlobalBounds();
对于(自动ptrTwo=this->astervector.begin();ptrTwo!=this->astervector.end();+ptrTwo){
if(missleBounds.intersects((*ptrTwo)->shape.getBounds())&(*ptrTwo)->isFinalForm==false){
对于(int i=0;i<3;++i){
这->创建小行星((*ptrTwo)->原点,true);
}
删除*ptrTwo;
这是一个向量擦除(ptrTwo);
}
else if(missleBounds.intersects((*ptrTwo)->shape.getBounds())&(*ptrTwo)->isFinalForm==true){
删除*ptrTwo;
这是一个向量擦除(ptrTwo);
}
}
}
}

将项插入向量(无论是否在向量末尾)会使该向量的所有迭代器无效。我怀疑你的createAsteroid会这样做。

首先,当你使用.erease函数时,迭代器会被更改,所以你需要更新它,在你的例子中,
ptr=this->asteroidVector.erase(ptrTwo)迭代器现在将指向删除后的下一个元素,因此请记住这一点(如果未使用.erase函数,请将指针减少一个或仅增加ptr(ptr++))


其次,我相信
this->createAsteroid((*ptrTwo)->起源,真的);
创建新项目,这也将使迭代器无效,因此一个修复方法是,在检查并删除旧的小行星后创建新的小行星。可能将新的小行星存储在for循环之前创建的向量中,将新的陨石添加到那里,然后在for循环之后将向量添加到当前的小行星向量中。

请选择,阅读,最后,提供一个.erase()使迭代器无效,使用移除/擦除惯用法是的,createAsteroid()将新对象推送到asteroidVector。有什么建议如何处理此问题吗?另一种方法是向后迭代。仅使已擦除元素处或之后的迭代器无效。