从向量列表中删除特定对象 我是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;
}