我是C ++的新手,对不起,如果这是一个虚假的问题。
我正在尝试创建一个方法,从向量中删除给定的指针,并删除其对象。这就是我现在所拥有的:
contextMenuStrip1.Items.Remove(contextMenuItem);
我正在调用这样的方法:
void Engine::destroyObject(GameObject* obj) {
if (obj == nullptr) {
std::cout << "Error: GameObject pointer given is null!" << std::endl;
return;
}
else if (m_GameObjects.empty()) {
std::cout << "Error: Trying to destroy GameObject while list is empty!" << std::endl;
return;
}
auto it = std::remove(m_GameObjects.begin(), m_GameObjects.end(), obj);
if (it != m_GameObjects.end()) {
delete obj;
m_GameObjects.erase(it, m_GameObjects.end());
}
}
GameObject* Engine::findObject(std::string name) {
return *std::find_if(m_GameObjects.begin(), m_GameObjects.end(), [name](GameObject* e) { return e->getName() == name; });
}
但由于某种原因,我的程序在GameObject* obj = findObject("Random");
destroyObject(obj);
崩溃并出现错误“vector iterator not dereferencable”
我尝试将行更改为m_GameObjects.erase(it, m_GameObjects.end());
,但这并没有改变任何内容。
提前致谢!
编辑:这里有更多信息 GameObject只是一个普通的类(有一些数据,比如名字......) findProject方法工作正常,它是导致错误的擦除行。
答案 0 :(得分:0)
所以aschepler发现我的findObject函数没有检查空值(如果对象不存在/无法找到),所以我添加了一些检查,现在就可以了。非常感谢!
GameObject* Engine::findObject(std::string name) {
auto it = std::find_if(m_GameObjects.begin(), m_GameObjects.end(), [name](GameObject* e) { return e->getName() == name; });
if (it == m_GameObjects.end())
return nullptr;
return *it;
}
然后,我必须检查该值是否为nullptr,如果是,则不执行任何操作。