From 437eadf1ed1dca4be3c58dafcca6e8c76c2dd65e Mon Sep 17 00:00:00 2001 From: AlexVinS Date: Wed, 31 Aug 2016 06:18:01 +0300 Subject: [PATCH] do not leak scenarioOpts in CMapInfo --- client/CPreGame.cpp | 2 +- lib/mapping/CMapInfo.cpp | 10 ++++++++-- lib/mapping/CMapInfo.h | 1 + 3 files changed, 10 insertions(+), 3 deletions(-) diff --git a/client/CPreGame.cpp b/client/CPreGame.cpp index 91a787b5d..1ae57cbf2 100644 --- a/client/CPreGame.cpp +++ b/client/CPreGame.cpp @@ -1146,7 +1146,7 @@ void SelectionTab::parseGames(const std::unordered_set &files, bool // Create the map info object CMapInfo mapInfo; mapInfo.mapHeader = make_unique(); - mapInfo.scenarioOpts = new StartInfo; + mapInfo.scenarioOpts = nullptr;//to be created by serialiser lf >> *(mapInfo.mapHeader.get()) >> mapInfo.scenarioOpts; mapInfo.fileURI = file.getName(); mapInfo.countPlayers(); diff --git a/lib/mapping/CMapInfo.cpp b/lib/mapping/CMapInfo.cpp index 0cd319d79..4fec37fe3 100644 --- a/lib/mapping/CMapInfo.cpp +++ b/lib/mapping/CMapInfo.cpp @@ -35,11 +35,13 @@ CMapInfo::CMapInfo() : scenarioOpts(nullptr), playerAmnt(0), humanPlayers(0), #define STEAL(x) x = std::move(tmp.x) -CMapInfo::CMapInfo(CMapInfo && tmp) +CMapInfo::CMapInfo(CMapInfo && tmp): + scenarioOpts(nullptr), playerAmnt(0), humanPlayers(0), + actualHumanPlayers(0), isRandomMap(false) { + std::swap(scenarioOpts, tmp.scenarioOpts); STEAL(mapHeader); STEAL(campaignHeader); - STEAL(scenarioOpts); STEAL(fileURI); STEAL(date); STEAL(playerAmnt); @@ -48,6 +50,10 @@ CMapInfo::CMapInfo(CMapInfo && tmp) STEAL(isRandomMap); } +CMapInfo::~CMapInfo() +{ + vstd::clear_pointer(scenarioOpts); +} void CMapInfo::mapInit(const std::string & fname) { diff --git a/lib/mapping/CMapInfo.h b/lib/mapping/CMapInfo.h index 2e204e84b..2a71f71ef 100644 --- a/lib/mapping/CMapInfo.h +++ b/lib/mapping/CMapInfo.h @@ -32,6 +32,7 @@ public: CMapInfo(); CMapInfo(CMapInfo && tmp); + virtual ~CMapInfo(); CMapInfo &operator=(CMapInfo &&other);