【问题标题】:Removing element from vector / deleting object从向量中删除元素/删除对象
【发布时间】:2014-05-05 20:19:27
【问题描述】:

我为我的代码遇到的两个问题而抓狂。

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

//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。

我破坏纹理似乎有问题。如果我取出“delete ....”并将其替换为对象的析构函数,它可以正常工作。

2) 向量下标超出范围

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

【问题讨论】:

  • 如果必须使用指针,请使用智能指针并删除delete 和析构函数调用行。
  • 谢谢!但它不应该像这样工作吗?
  • 你应该使用i &lt; GameObjects.size()。如果你删除最后一个元素,那么在下一次迭代中 i 实际上会比 GameObjects.size() 多一个,它会继续进入循环。
  • 另外,也许更符合最佳实践,i != GameObjects.end() 是可能的意图(注意使用 end() 成员函数替换 size())。
  • @happydave 谢谢老兄!我试过了,我仍然得到错误。这可能是一个愚蠢的问题,但我的对象可以有不同的大小吗?这就是为什么?

标签: c++ object vector sdl subscript


【解决方案1】:

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

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

【讨论】:

  • @user3466904 本质上,必须审查预期算法与实际实现行为。
  • 我明白了。这就说得通了。一旦我找到了一个对象,现在我添加了一个休息;然后退出循环!谢谢!这很好用。删除....现在也很好用!
  • 谢谢大家!我学到了很多东西。我真的很感激!
  • @user3466904:跳出循环不会检测是否有多个元素需要删除。如果这对您的问题没问题,请继续,但如果您想删除多个元素,则需要重新设计循环。还可以考虑使用智能指针而不是原始指针,以避免手动管理内存。
  • 这个,没关系。但我会定义。研究我在这里被告知的内容!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-08-17
  • 2020-05-22
  • 1970-01-01
  • 2020-05-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多