c++ - 从 vector 中删除元素/删除对象

标签 c++ object vector sdl subscript

我对我的代码中遇到的两个问题感到抓狂。

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

//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) vector 下标超出范围

所以如果我用析构函数通过第一个问题。我遇到了下一个。现在即使我使用“GameObjects.erase(GameObjects.begin());”我得到了同样的错误。

最佳答案

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

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

关于c++ - 从 vector 中删除元素/删除对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22677796/

相关文章:

c++ - 返回 const 引用与临时对象

java - 从Android SIP类调用SipProfile.Builder时出现未处理的异常

javascript - 我可以在 Javascript 中为我创建的对象创建自定义事件吗?

C++标准模板库 vector 题

c++ - 以下合并排序数组 C++ 代码有什么问题?

c++ - 关于多线程程序中的临时对象

c++ - 返回值为const引用时如何返回 "not found"

javascript - 检索从调用函数传递的对象的 ID

java - 使用 Matrix4f 围绕多个轴进行框旋转

c++ - 我有一个 STL vector 列表,我想按每个 vector 的第一个元素对它们进行排序