From f297adab478e2bf248b9f12091944ba47df4f2f2 Mon Sep 17 00:00:00 2001 From: Caldfir Date: Sat, 26 May 2012 14:09:40 -0700 Subject: Removed a memory leak associated with blocks that were being permanently cached. --- BlockFactory.cpp | 43 +++++++++++++++++++++++++++---------------- BlockFactory.h | 2 ++ main.cpp | 4 ++++ 3 files changed, 33 insertions(+), 16 deletions(-) diff --git a/BlockFactory.cpp b/BlockFactory.cpp index 03c6e8a..5d9d63b 100644 --- a/BlockFactory.cpp +++ b/BlockFactory.cpp @@ -6,32 +6,43 @@ BlockFactory blockFactory; BlockFactory::BlockFactory(void) { - poolSize = 0; + poolSize = 0; + blocksCreated = 0; } BlockFactory::~BlockFactory(void) { - for(uint32_t i=0; i 0 ){ - poolSize--; - Block* b = pool[poolSize]; - pool.pop_back(); - return b; - } - - //pool is empty(full), just New up a new block - Block* b = (Block*) malloc( sizeof(Block) ); - return b; + if( poolSize > 0 ){ + poolSize--; + Block* b = pool[poolSize]; + pool.pop_back(); + return b; + } + + //pool is empty(full), just New up a new block + blocksCreated++; + Block* b = (Block*) malloc( sizeof(Block) ); + return b; } void BlockFactory::deleteBlock(Block *b){ - poolSize++; - pool.push_back( b ); + if(2*poolSize < blocksCreated){ + poolSize++; + pool.push_back( b ); + } + else{ + blocksCreated--; + free( b ); + } } diff --git a/BlockFactory.h b/BlockFactory.h index a122dd6..a8d2046 100644 --- a/BlockFactory.h +++ b/BlockFactory.h @@ -5,6 +5,7 @@ class BlockFactory { uint32_t poolSize; + uint32_t blocksCreated; vector pool; public: @@ -13,6 +14,7 @@ public: Block* allocateBlock( ); void deleteBlock( Block* ); uint32_t getPoolSize(){ return poolSize; } + uint32_t getBlocksCreated(){ return blocksCreated; } }; diff --git a/main.cpp b/main.cpp index 63cf86e..f76bac4 100644 --- a/main.cpp +++ b/main.cpp @@ -6,6 +6,7 @@ using namespace std; #include "common.h" #include "Block.h" +#include "BlockFactory.h" #include "GUI.h" //#include "SpriteMaps.h" #include "GameBuildings.h" @@ -521,6 +522,9 @@ static void * stonesense_thread(ALLEGRO_THREAD * main_thread, void * parms) delete last; } + //need to explicitly tear down the current block factory + blockFactory.~BlockFactory(); + al_destroy_bitmap(IMGIcon); IMGIcon = 0; delete contentLoader; -- cgit v1.2.1