The only logical thing is that you are calling setMonsterColor (i.e. too many times) more than you are deleting the monsters OR you added some other code elsewhere that has caused the problem OR your image freeing and type deletion code is wrong.
You could stick a counter in the setMonsterColor and deletion funcitons to see if they are the same number when your program exits. That'll tell you if you have made a mistke.
You could stick a counter in the setMonsterColor and deletion funcitons to see if they are the same number when your program exits. That'll tell you if you have made a mistke.