Explorar o código

Fix memory leak

SDL_RWFromMem does not take the ownership of the passed memory, so we
have to free it ourselves.
Krzesimir Nowak %!s(int64=9) %!d(string=hai) anos
pai
achega
46bd1c40cc
Modificáronse 2 ficheiros con 7 adicións e 6 borrados
  1. 5 5
      client/CMusicHandler.cpp
  2. 2 1
      client/CMusicHandler.h

+ 5 - 5
client/CMusicHandler.cpp

@@ -128,8 +128,8 @@ void CSoundHandler::release()
 
 		for (auto &chunk : soundChunks)
 		{
-			if (chunk.second)
-				Mix_FreeChunk(chunk.second);
+			if (chunk.second.first)
+				Mix_FreeChunk(chunk.second.first);
 		}
 	}
 
@@ -142,14 +142,14 @@ Mix_Chunk *CSoundHandler::GetSoundChunk(std::string &sound, bool cache)
 	try
 	{
 		if (cache && soundChunks.find(sound) != soundChunks.end())
-			return soundChunks[sound];
+			return soundChunks[sound].first;
 
 		auto data = CResourceHandler::get()->load(ResourceID(std::string("SOUNDS/") + sound, EResType::SOUND))->readAll();
-		SDL_RWops *ops = SDL_RWFromMem(data.first.release(), data.second);
+		SDL_RWops *ops = SDL_RWFromMem(data.first.get(), data.second);
 		Mix_Chunk *chunk = Mix_LoadWAV_RW(ops, 1);	// will free ops
 
 		if (cache)
-			soundChunks.insert(std::pair<std::string, Mix_Chunk *>(sound, chunk));
+			soundChunks.insert(std::pair<std::string, CachedChunk>(sound, std::make_pair (chunk, std::move (data.first))));
 
 		return chunk;
 	}

+ 2 - 1
client/CMusicHandler.h

@@ -41,7 +41,8 @@ private:
 	SettingsListener listener;
 	void onVolumeChange(const JsonNode &volumeNode);
 
-	std::map<std::string, Mix_Chunk *> soundChunks;
+	using CachedChunk = std::pair<Mix_Chunk *, std::unique_ptr<ui8[]>>;
+	std::map<std::string, CachedChunk> soundChunks;
 
 	Mix_Chunk *GetSoundChunk(std::string &sound, bool cache);