矢量擦除过程中的分段错误

时间:2017-12-14 18:49:00

标签: c++ vector erase fault

我正在开发一个小行星游戏克隆,但我在从小行星矢量中删除元素时遇到了问题。因此,一般当我击中小行星时,它应分成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);
                }
            }
    }
}

2 个答案:

答案 0 :(得分:1)

首先,当你使用.erease函数时,迭代器会被更改,所以你需要更新它,在你的情况下,ptr = this->asteroidVector.erase(ptrTwo);迭代器现在指向删除后的下一个元素,所以保持它mind(要么将指针减少一个,要么只增加ptr(ptr ++),如果你没有使用.erase函数。

其次,我相信this->createAsteroid((*ptrTwo)->origin,true);会创建新项目,这也会使迭代器无效,因此可以在检查和删除旧小行星后创建新的小行星。也许将新的小行星存储在for循环之前创建的向量中,在那里添加新的陨石,并在for循环之后将向量添加到当前的小行星向量中。

答案 1 :(得分:0)

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