从矢量擦除期间出现分段错误
Segmentation fault during erasing from vector
我正在开发小行星游戏克隆,但在从小行星向量中擦除元素时遇到问题。所以一般来说,当我撞到小行星时,它应该分成三部分。所以我创造了 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);
}
}
}
}
将项目插入向量(无论是否在向量的末尾)会使该向量的所有迭代器失效。我怀疑你的 createAsteroid 这样做了。
首先,当您使用 .erease 函数时,迭代器已更改,因此您需要更新它,在您的情况下,ptr = this->asteroidVector.erase(ptrTwo);
迭代器现在将指向删除后的下一个元素,因此请保留请记住这一点(如果您没有使用 .erase 函数,要么将指针减一,要么只增加 ptr (ptr++)。
其次,我相信 this->createAsteroid((*ptrTwo)->origin,true);
会创建新项目,这也会使迭代器失效,因此一种解决方法是,在检查并删除旧小行星后创建新小行星。也许将新的小行星存储在 for 循环之前创建的向量中,在那里添加新的陨石,然后在 for 循环之后将向量添加到当前的小行星向量中。
我正在开发小行星游戏克隆,但在从小行星向量中擦除元素时遇到问题。所以一般来说,当我撞到小行星时,它应该分成三部分。所以我创造了 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);
}
}
}
}
将项目插入向量(无论是否在向量的末尾)会使该向量的所有迭代器失效。我怀疑你的 createAsteroid 这样做了。
首先,当您使用 .erease 函数时,迭代器已更改,因此您需要更新它,在您的情况下,ptr = this->asteroidVector.erase(ptrTwo);
迭代器现在将指向删除后的下一个元素,因此请保留请记住这一点(如果您没有使用 .erase 函数,要么将指针减一,要么只增加 ptr (ptr++)。
其次,我相信 this->createAsteroid((*ptrTwo)->origin,true);
会创建新项目,这也会使迭代器失效,因此一种解决方法是,在检查并删除旧小行星后创建新小行星。也许将新的小行星存储在 for 循环之前创建的向量中,在那里添加新的陨石,然后在 for 循环之后将向量添加到当前的小行星向量中。