2017-07-21 53 views
0

我是C++新手,很遗憾,如果它是一个虚拟问题。从矢量列表中删除特定对象

我想创建一个方法,将从一个向量中删除给定的指针,并删除它的对象。这就是我现在所拥有的:

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); 

但由于某些原因,在m_GameObjects.erase(it, m_GameObjects.end());与错误我的程序崩溃“矢量迭代器不dereferencable”

我已经尝试将行更改为it = m_GameObjects.erase(it, m_GameObjects.end());但这并没有改变任何东西。

提前致谢!

编辑:这里有更多的信息 游戏对象仅仅是一个普通类(有一些数据,如姓名...) 的findProject方法工作得很好,它是擦除这是造成错误的行。

+0

无法复制:http://coliru.stacked-crooked.com/a/98a14577189a140f请修改您的问题以包含[mcve],它看起来像那个链接,但包含实际上需要的代码以获得相同的你做错了。 – aschepler

+5

可能不相关,但如果vector中没有对象具有请求的名称,则您的'findObject'函数具有未定义的行为。 – aschepler

+0

发动机是否必须参与?如果你使用'boost :: shared_ptr',一个the_vector.erase(它)会得到被调用的对象析构函数。 – lakeweb

回答

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,如果是的话不做任何事情。