从向量列表中删除特定对象 我是C++新手,如果这是个虚拟问题,对不起。
我试图创建一个方法,从向量中删除给定的指针,并删除其对象。以下是我现在拥有的:从向量列表中删除特定对象 我是C++新手,如果这是个虚拟问题,对不起。,c++,stdvector,erase,C++,Stdvector,Erase,我试图创建一个方法,从向量中删除给定的指针,并删除其对象。以下是我现在拥有的: void Engine::destroyObject(GameObject* obj) { if (obj == nullptr) { std::cout << "Error: GameObject pointer given is null!" << std::endl; return; } else if (m_GameObject
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; });
}
但由于某种原因,我的程序在m_GameObjects.erase(it,m_GameObjects.end())崩溃代码>错误为“向量迭代器不可解引用”
我已经尝试将行更改为it=m_GameObjects.erase(it,m_GameObjects.end())代码>但这并没有改变任何事情
提前谢谢
编辑:这里有更多的信息
GameObject只是一个普通类(带有一些数据,例如名称…)
findProject方法工作正常,导致错误的是擦除行。因此发现我的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;
}
然后,我必须检查该值是否为null ptr,如果是,则不做任何操作。无法复制:请编辑您的问题,使其包含一个类似于该链接的内容,但包含实际需要的代码,以获得与您相同的错误。可能不相关,但是如果向量中没有对象具有请求的名称,则您的findObject
函数具有未定义的行为。是否必须涉及引擎?如果您使用boost::shared_ptr
a,则_vector.erase(它)将调用对象析构函数。好的,对不起,我刚才检查了@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;
}