Fixed memory leaks in TileManager
authorIngo Ruhnke <grumbel@gmail.com>
Tue, 12 Aug 2014 21:04:57 +0000 (23:04 +0200)
committerIngo Ruhnke <grumbel@gmail.com>
Tue, 12 Aug 2014 21:04:57 +0000 (23:04 +0200)
src/supertux/level.cpp
src/supertux/resources.cpp
src/supertux/tile_manager.cpp
src/supertux/tile_manager.hpp
src/worldmap/worldmap.cpp

index 00d3335..b3644d6 100644 (file)
@@ -77,7 +77,7 @@ Level::load(const std::string& filepath)
 
     const lisp::Lisp* tilesets_lisp = level->get_lisp("tilesets");
     if(tilesets_lisp != NULL) {
-      tileset      = tile_manager->parse_tileset_definition(*tilesets_lisp);
+      tileset      = tile_manager->parse_tileset_definition(*tilesets_lisp).release();
       free_tileset = true;
     }
     std::string tileset_name;
index 2eac6a6..c29fa90 100644 (file)
@@ -90,15 +90,9 @@ Resources::unload_shared()
     big_font.reset();
   
   /* Free tilesets */
-  if(tile_manager != NULL)
-  {
-    for(TileManager::TileSets::iterator it = tile_manager->tilesets.begin();
-        it != tile_manager->tilesets.end(); ++it)
-    {
-      delete it->second;
-      it->second = NULL;
-    }
-  }
+  delete tile_manager;
+  tile_manager = 0;
+
   if(sprite_manager != NULL)
   {
     delete sprite_manager;
index 0b8ff04..090b55c 100644 (file)
@@ -31,21 +31,27 @@ TileManager::~TileManager()
 {
 }
 
-TileSet* TileManager::get_tileset(const std::string &filename)
+TileSet*
+TileManager::get_tileset(const std::string &filename)
 {
   TileSets::const_iterator i = tilesets.find(filename);
   if(i != tilesets.end())
-    return i->second;
-
-  std::unique_ptr<TileSet> tileset (new TileSet(filename));
-  tilesets.insert(std::make_pair(filename, tileset.get()));
-
-  return tileset.release();
+  {
+    return i->second.get();
+  }
+  else
+  {
+    std::unique_ptr<TileSet> tileset(new TileSet(filename));
+    TileSet* result = tileset.get();
+    tilesets.insert(std::make_pair(filename, std::move(tileset)));
+    return result;
+  }
 }
 
-TileSet* TileManager::parse_tileset_definition(const Reader& reader)
+std::unique_ptr<TileSet>
+TileManager::parse_tileset_definition(const Reader& reader)
 {
-  std::unique_ptr<TileSet> result(new TileSet());
+  std::unique_ptr<TileSet> result(new TileSet);
 
   lisp::ListIterator iter(&reader);
   while(iter.next()) {
@@ -74,7 +80,7 @@ TileSet* TileManager::parse_tileset_definition(const Reader& reader)
     result->merge(tileset, start, end, offset);
   }
 
-  return result.release();
+  return std::move(result);
 }
 
 /* EOF */
index 5d1317e..6a5fcee 100644 (file)
@@ -18,6 +18,7 @@
 #define HEADER_SUPERTUX_SUPERTUX_TILE_MANAGER_HPP
 
 #include <map>
+#include <memory>
 #include <string>
 
 #include "util/reader_fwd.hpp"
@@ -26,9 +27,8 @@ class TileSet;
 
 class TileManager
 {
-  friend class Resources;
 private:
-  typedef std::map<std::string, TileSet*> TileSets;
+  typedef std::map<std::string, std::unique_ptr<TileSet> > TileSets;
   TileSets tilesets;
 
 public:
@@ -37,7 +37,7 @@ public:
 
   TileSet* get_tileset(const std::string &filename);
 
-  TileSet* parse_tileset_definition(const Reader& reader);
+  std::unique_ptr<TileSet> parse_tileset_definition(const Reader& reader);
 };
 
 #endif
index 3bda837..dfc3bfc 100644 (file)
@@ -264,7 +264,7 @@ WorldMap::load(const std::string& filename)
 
     const lisp::Lisp* tilesets_lisp = level->get_lisp("tilesets");
     if(tilesets_lisp != NULL) {
-      tileset      = tile_manager->parse_tileset_definition(*tilesets_lisp);
+      tileset      = tile_manager->parse_tileset_definition(*tilesets_lisp).release();
       free_tileset = true;
     }
     std::string tileset_name;