Browse Source

do not leak scenarioOpts in CMapInfo

AlexVinS 9 years ago
parent
commit
437eadf1ed
3 changed files with 10 additions and 3 deletions
  1. 1 1
      client/CPreGame.cpp
  2. 8 2
      lib/mapping/CMapInfo.cpp
  3. 1 0
      lib/mapping/CMapInfo.h

+ 1 - 1
client/CPreGame.cpp

@@ -1146,7 +1146,7 @@ void SelectionTab::parseGames(const std::unordered_set<ResourceID> &files, bool
 			// Create the map info object
 			CMapInfo mapInfo;
 			mapInfo.mapHeader = make_unique<CMapHeader>();
-			mapInfo.scenarioOpts = new StartInfo;
+			mapInfo.scenarioOpts = nullptr;//to be created by serialiser
 			lf >> *(mapInfo.mapHeader.get()) >> mapInfo.scenarioOpts;
 			mapInfo.fileURI = file.getName();
 			mapInfo.countPlayers();

+ 8 - 2
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)
 {

+ 1 - 0
lib/mapping/CMapInfo.h

@@ -32,6 +32,7 @@ public:
 
 	CMapInfo();
 	CMapInfo(CMapInfo && tmp);
+	virtual ~CMapInfo();
 
 	CMapInfo &operator=(CMapInfo &&other);