【发布时间】: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 < GameObjects.size()。如果你删除最后一个元素,那么在下一次迭代中 i 实际上会比 GameObjects.size() 多一个,它会继续进入循环。 -
另外,也许更符合最佳实践,
i != GameObjects.end()是可能的意图(注意使用 end() 成员函数替换 size())。 -
@happydave 谢谢老兄!我试过了,我仍然得到错误。这可能是一个愚蠢的问题,但我的对象可以有不同的大小吗?这就是为什么?
标签: c++ object vector sdl subscript