gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 02:52:44 26 4
gpt4 key购买 nike

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

我正在尝试从包含对象列表的 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com