私は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メソッドが正常に動作します(名前など、いくつかのデータを持つ...)普通のクラス あります、それはエラーを引き起こしているの消去のためのラインです。
再生できません:http://coliru.stacked-crooked.com/a/98a14577189a140f [mcve]を含むように質問を編集してください。このリンクは、そのリンクのように見えますが、実際には同じコードを取得するために必要なコードが含まれていますエラーがあります。 – aschepler
おそらく無関係かもしれませんが、ベクトル内のオブジェクトに要求された名前がない場合、 'findObject'関数は未定義の動作をします。 – aschepler
エンジンが関与していなければなりませんか? 'boost :: shared_ptr'を使うと、the_vector.erase(it)は呼び出されたオブジェクトデストラクタを取得します。 – lakeweb