From b5ddde8475ac08294cf133a6c7077aa03c323884 Mon Sep 17 00:00:00 2001 From: Stoyan Gaydarov Date: Sun, 8 Jul 2018 11:34:12 -0700 Subject: [PATCH] Use a shared_ptr to avoid having to manage VersionInfo vector memory --- library/Process-darwin.cpp | 2 +- library/Process-linux.cpp | 2 +- library/Process-windows.cpp | 2 +- library/VersionInfoFactory.cpp | 17 ++++++----------- library/include/VersionInfoFactory.h | 8 +++++--- 5 files changed, 14 insertions(+), 17 deletions(-) diff --git a/library/Process-darwin.cpp b/library/Process-darwin.cpp index 58e78d7ce..614432584 100644 --- a/library/Process-darwin.cpp +++ b/library/Process-darwin.cpp @@ -66,7 +66,7 @@ Process::Process(VersionInfoFactory * known_versions) : identified(false), my_pe // get hash of the running DF process my_md5 = md5.getHashFromFile(real_path, length, (char *) first_kb); // create linux process, add it to the vector - VersionInfo * vinfo = known_versions->getVersionInfoByMD5(my_md5); + const VersionInfo * vinfo = known_versions->getVersionInfoByMD5(my_md5); if(vinfo) { my_descriptor.reset(new VersionInfo(*vinfo)); diff --git a/library/Process-linux.cpp b/library/Process-linux.cpp index f18eff5f8..37e55865e 100644 --- a/library/Process-linux.cpp +++ b/library/Process-linux.cpp @@ -70,7 +70,7 @@ Process::Process(VersionInfoFactory * known_versions) : identified(false), my_pe // get hash of the running DF process my_md5 = md5.getHashFromFile(self_exe_name, length, (char *) first_kb); // create linux process, add it to the vector - VersionInfo * vinfo = known_versions->getVersionInfoByMD5(my_md5); + const VersionInfo * vinfo = known_versions->getVersionInfoByMD5(my_md5); if(vinfo) { my_descriptor.reset(new VersionInfo(*vinfo)); diff --git a/library/Process-windows.cpp b/library/Process-windows.cpp index aa20ec8b8..a45afa619 100644 --- a/library/Process-windows.cpp +++ b/library/Process-windows.cpp @@ -95,7 +95,7 @@ Process::Process(VersionInfoFactory * factory) : identified(false) return; } my_pe = d->pe_header.FileHeader.TimeDateStamp; - VersionInfo* vinfo = factory->getVersionInfoByPETimestamp(my_pe); + const VersionInfo* vinfo = factory->getVersionInfoByPETimestamp(my_pe); if(vinfo) { identified = true; diff --git a/library/VersionInfoFactory.cpp b/library/VersionInfoFactory.cpp index c895a1510..7a15a2d81 100644 --- a/library/VersionInfoFactory.cpp +++ b/library/VersionInfoFactory.cpp @@ -52,31 +52,26 @@ VersionInfoFactory::~VersionInfoFactory() void VersionInfoFactory::clear() { - // for each stored version, delete - for(size_t i = 0; i < versions.size();i++) - { - delete versions[i]; - } versions.clear(); error = false; } -VersionInfo * VersionInfoFactory::getVersionInfoByMD5(string hash) +const VersionInfo * VersionInfoFactory::getVersionInfoByMD5(string hash) { for(size_t i = 0; i < versions.size();i++) { if(versions[i]->hasMD5(hash)) - return versions[i]; + return versions[i].get(); } return 0; } -VersionInfo * VersionInfoFactory::getVersionInfoByPETimestamp(uintptr_t timestamp) +const VersionInfo * VersionInfoFactory::getVersionInfoByPETimestamp(uintptr_t timestamp) { for(size_t i = 0; i < versions.size();i++) { if(versions[i]->hasPE(timestamp)) - return versions[i]; + return versions[i].get(); } return 0; } @@ -230,8 +225,8 @@ bool VersionInfoFactory::loadFile(string path_to_xml) const char *name = pMemInfo->Attribute("name"); if(name) { - VersionInfo *version = new VersionInfo(); - ParseVersion( pMemInfo , version ); + auto version = std::make_shared(); + ParseVersion( pMemInfo , version.get() ); versions.push_back(version); } } diff --git a/library/include/VersionInfoFactory.h b/library/include/VersionInfoFactory.h index 8a2cabdc3..a03c11aa1 100644 --- a/library/include/VersionInfoFactory.h +++ b/library/include/VersionInfoFactory.h @@ -25,6 +25,8 @@ distribution. #pragma once +#include + #include "Pragma.h" #include "Export.h" @@ -39,9 +41,9 @@ namespace DFHack ~VersionInfoFactory(); bool loadFile( std::string path_to_xml); bool isInErrorState() const {return error;}; - VersionInfo * getVersionInfoByMD5(std::string md5string); - VersionInfo * getVersionInfoByPETimestamp(uintptr_t timestamp); - std::vector versions; + const VersionInfo * getVersionInfoByMD5(std::string md5string); + const VersionInfo * getVersionInfoByPETimestamp(uintptr_t timestamp); + std::vector> versions; // trash existing list void clear(); private: