From a6caff1387894654df79a8158c53a270237d09ce Mon Sep 17 00:00:00 2001 From: Lioncash Date: Fri, 19 Jun 2020 03:22:22 -0400 Subject: [PATCH] CPoiToWorld: Make use of unique_ptr Safer memory management. --- src/Core/Resource/CPoiToWorld.cpp | 46 ++++++++++++++----------------- src/Core/Resource/CPoiToWorld.h | 5 ++-- 2 files changed, 24 insertions(+), 27 deletions(-) diff --git a/src/Core/Resource/CPoiToWorld.cpp b/src/Core/Resource/CPoiToWorld.cpp index b4a55868..e508f9d4 100644 --- a/src/Core/Resource/CPoiToWorld.cpp +++ b/src/Core/Resource/CPoiToWorld.cpp @@ -1,29 +1,25 @@ #include "CPoiToWorld.h" -CPoiToWorld::CPoiToWorld(CResourceEntry *pEntry /*= 0*/) +CPoiToWorld::CPoiToWorld(CResourceEntry *pEntry) : CResource(pEntry) { } -CPoiToWorld::~CPoiToWorld() -{ - for (auto it = mMaps.begin(); it != mMaps.end(); it++) - delete *it; -} +CPoiToWorld::~CPoiToWorld() = default; void CPoiToWorld::AddPoi(uint32 PoiID) { // Check if this POI already exists - auto it = mPoiLookupMap.find(PoiID); + const auto it = mPoiLookupMap.find(PoiID); - if (it == mPoiLookupMap.end()) - { - SPoiMap *pMap = new SPoiMap(); - pMap->PoiID = PoiID; + if (it != mPoiLookupMap.end()) + return; - mMaps.push_back(pMap); - mPoiLookupMap[PoiID] = pMap; - } + auto pMap = std::make_unique(); + pMap->PoiID = PoiID; + + auto* ptr = mMaps.emplace_back(std::move(pMap)).get(); + mPoiLookupMap.insert_or_assign(PoiID, ptr); } void CPoiToWorld::AddPoiMeshMap(uint32 PoiID, uint32 ModelID) @@ -45,7 +41,7 @@ void CPoiToWorld::AddPoiMeshMap(uint32 PoiID, uint32 ModelID) void CPoiToWorld::RemovePoi(uint32 PoiID) { - for (auto it = mMaps.begin(); it != mMaps.end(); it++) + for (auto it = mMaps.begin(); it != mMaps.end(); ++it) { if ((*it)->PoiID == PoiID) { @@ -58,19 +54,19 @@ void CPoiToWorld::RemovePoi(uint32 PoiID) void CPoiToWorld::RemovePoiMeshMap(uint32 PoiID, uint32 ModelID) { - auto MapIt = mPoiLookupMap.find(PoiID); + const auto MapIt = mPoiLookupMap.find(PoiID); - if (MapIt != mPoiLookupMap.end()) + if (MapIt == mPoiLookupMap.end()) + return; + + SPoiMap *pMap = MapIt->second; + + for (auto ListIt = pMap->ModelIDs.begin(); ListIt != pMap->ModelIDs.end(); ++ListIt) { - SPoiMap *pMap = MapIt->second; - - for (auto ListIt = pMap->ModelIDs.begin(); ListIt != pMap->ModelIDs.end(); ListIt++) + if (*ListIt == ModelID) { - if (*ListIt == ModelID) - { - pMap->ModelIDs.erase(ListIt); - break; - } + pMap->ModelIDs.erase(ListIt); + break; } } } diff --git a/src/Core/Resource/CPoiToWorld.h b/src/Core/Resource/CPoiToWorld.h index f862c26c..aa5e08aa 100644 --- a/src/Core/Resource/CPoiToWorld.h +++ b/src/Core/Resource/CPoiToWorld.h @@ -4,6 +4,7 @@ #include "CResource.h" #include #include +#include #include class CPoiToWorld : public CResource @@ -18,7 +19,7 @@ public: }; private: - std::vector mMaps; + std::vector> mMaps; std::map mPoiLookupMap; public: @@ -37,7 +38,7 @@ public: const SPoiMap* MapByIndex(size_t Index) const { - return mMaps[Index]; + return mMaps[Index].get(); } const SPoiMap* MapByID(uint32 InstanceID) const