从矢量/删除对象中删除元素

时间:2014-03-27 03:39:07

标签: c++ object vector sdl subscript

我对我的代码遇到的两个问题感到很疯狂。

我正在尝试从包含对象列表的向量中删除一个元素。

//Remove Object
if (button2 == true)
{ 
    //go through objects and check collision
    for (std::vector<cOBJECT*>::size_type i = 0; i != GameObjects.size(); i++)
    {
        //Check for collision and delete object
        if (MouseRect(GameObjects[i]->getrect(), mx + offX, my + offY) == true)
        {
            //GameObjects[i]->~cOBJECT();
            delete GameObjects[i];
            GameObjects.erase(GameObjects.begin() + i);
        }
    }
} // if (button2 == true)

由于某些原因,我遇到了两个问题。

1)访问违规读取位置0xFEEEFEEE。

似乎在某种程度上我遇到了破坏纹理的问题。如果我取出“删除....”并将其替换为对象的析构函数,它可以正常工作。

2)矢量下标超出范围

因此,如果我使用destuctor传递第一个问题。我遇到了下一个。现在即使我使用“GameObjects.erase(GameObjects.begin());”我得到了同样的错误。

1 个答案:

答案 0 :(得分:2)

如果你仔细考虑你实现的操作,你会注意到当第i个元素匹配时你从向量中移除该元素并且第(i + 1)个元素被移动到第i个位置,但此时已达到循环结束并且i递增,这意味着您不会测试最初位于(i + 1)位置的元素(现在位于第i个位置)并且如果在移除之前i的值为GameObjects.size() - 1,则变量i现在具有GameObjects.size()+1的值并且循环不会终止。

关于delete的问题,您应该检查是否创建了该对象。除非它被分配new,否则你不应该在指针上调用delete