从矢量列表中删除特定对象

时间:2017-07-21 22:09:16

标签: c++ stdvector erase

我是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方法工作正常,它是导致错误的擦除行。

1 个答案:

答案 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,如果是,则不执行任何操作。