From bc738c56406384d22ba0756fe3641e0070cf2fc5 Mon Sep 17 00:00:00 2001 From: fredzio Date: Tue, 3 Aug 2021 07:00:42 +0200 Subject: [PATCH] Use extract/insert instead of erase/emplace When we call moveObject(), we might trigger a change of cell for the actor, which in turn triggers updatePtr(). The erase/emplace construct invalidate references, whereas extract/insert do not. The reason is was working before !1075 is because we were always "refreshing" the reference by a call to getActor(). --- apps/openmw/mwphysics/physicssystem.cpp | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/apps/openmw/mwphysics/physicssystem.cpp b/apps/openmw/mwphysics/physicssystem.cpp index 67766e4bf9..85fb463a95 100644 --- a/apps/openmw/mwphysics/physicssystem.cpp +++ b/apps/openmw/mwphysics/physicssystem.cpp @@ -519,13 +519,12 @@ namespace MWPhysics mObjects.emplace(updated, std::move(obj)); } - ActorMap::iterator foundActor = mActors.find(old); - if (foundActor != mActors.end()) + auto actorNode = mActors.extract(old); + if (!actorNode.empty()) { - auto actor = foundActor->second; - actor->updatePtr(updated); - mActors.erase(foundActor); - mActors.emplace(updated, std::move(actor)); + actorNode.key() = updated; + actorNode.mapped()->updatePtr(updated); + mActors.insert(std::move(actorNode)); } for (auto& [_, actor] : mActors)