C++,Visual Studio 2015, vector 迭代器不可取消引用

标签 c++

好的,所以我设法在我的游戏中写了一个删除导弹的方法,但我经常收到这个错误,我不知道为什么。任何想法如何处理这个问题?此外,我想摆脱这个 i 迭代器,但我不知道如何正确使用导弹的删除和删除。

    {
        int i = 0;
        for (auto it = missle_vector.begin(); it != missle_vector.end(); ++it) {
            score += missle_vector[i]->collision(i, missle_vector, enemy_vector, obstacle_vector, 1);
            displayMissle(**it);
            (*it)->moove(50, 0);
            i++;
        }
    } //this is how i use it

int Missle::collision(unsigned int i, vector <Missle*> &missle_vector, vector <Enemy*> &enemy_vector,
                            vector <Obstacle*> &obstacle_vector, bool G)
{
int hit=0;
for (auto it=enemy_vector.begin(); it!=enemy_vector.end(); )
{
    double x, y;
    x=(*it)->getX()-getX();
    y=(*it)->getY()-getY();
    if (x<64 && x>-151 && y<14 && y>-103)
    {
        delete  missle_vector[i];
        missle_vector.erase(missle_vector.begin() + i);
        delete *it;
        enemy_vector.erase(it);
        hit++;
    }
    else
        ++it;
}
if(G){
for (auto it=obstacle_vector.begin(); it!=obstacle_vector.end(); ++it)
    {
        double x, y;
        x=(*it)->getX()-getX();
        y=(*it)->getY()-getY();
        if (x<64 && x>-61 && y<14 && y>-61)
        {
            delete  missle_vector[i];
            missle_vector.erase(missle_vector.begin()+i);
        }
    }
}
if (getX()>1920)
{
    delete missle_vector[i];
    missle_vector.erase(missle_vector.begin()+i);
}
return hit;
} //method itself

最佳答案

这是一个断言:

Vector iterator not dereferencable

这意味着您正在取消引用和迭代器,例如结束迭代器。例如这个简短的例子将生成这个断言:

std::vector<int> v;
*v.end();

此断言应出现在调试期间的运行时,并允许您找到问题存在的确切位置。在 Visual Studio 中,您可以使用调试器查找局部变量、调用堆栈。

[编辑]

在这里您可以在代码中获得此断言:

 enemy_vector.erase(it);

这应该是:

 it = enemy_vector.erase(it);

否则在下一次迭代中你的它将无效并且*它将导致Vector iterator not dereferencable。甚至 it!=enemy_vector.end() 也应该是未定义的行为。

关于C++,Visual Studio 2015, vector 迭代器不可取消引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36816930/

相关文章:

c++ - 将 SVG 转换为光栅的 C/C 库。

c++ - 如何使用 gcov 抑制模板内联

c++ - libespeak 在消息末尾发出额外的音节

c++ - 错误 : expected primary-expression before ‘,’

c++ - 为什么 unsigned int 在 C++ 中给出负值?

c++ - 以下模板函数的含义?

c++ - 如何使用 boost::gil 处理数字像素操作中的溢出?

C++ 从文本文件创建对象

c++ - 如何更改我的应用程序使用的 .dll 搜索路径?

c++ - 如何在 SuperpixelSLIC 中找到段的唯一标签