캐쉬를 만들면 어떨까요?
미리 템플릿 클래스를 하나만들고 내부구조는 벡터로 만드었는 캐쉬클래스 한개.
그리고 몬스터 정보를 가지고 있는 몬스터 클래스,
그럼 몬스터 객체를 캐쉬에 요구하면 new로 생성하거나 벡터안에서 꺼내어서 주고,
죽었으면 다시 캐쉬로 주면 캐쉬양이 허락하는 한도까지는 delete하지 않고 벡터에 저장하는거죠.(나중에 요구할때 다시 꺼내줄려고)
Factory패턴이랑 좀 비슷하죠.

밑에 소스는 저도 예전에 비슷한 고민을 할때 어디서 줍은 소스입니다.
출처는 Game Programming Gems2이라고 하더군요(저도 이 책은 안보아서 잘..-0-;)

template <class T>
class TCache
{
public:

   TCache(unsigned int MaxCacheSize)
      : mMaxCacheSize(MaxCacheSize)
   {
      mCache.reserve(MaxCacheSize);
   }

   ~TCache()
   {
      Clear();
   }


   // Returns NULL if no objects available in cache
   T* Retrieve()
   {
      T* pItem = NULL;

      if (false == mCache.empty())
      {
         pItem = mCache.back();
         mCache.pop_back();
      }

      return pItem;
   }

   // Creates a new object on the help if no objects
   // available in cache
   T* RetrieveOrCreate()
   {
      T* pItem = NULL;

      if (false == mCache.empty())
      {
         pItem = mCache.back();
         mCache.pop_back();
      }
      else
         pItem = new T;

      return pItem;
   }

   void Release(T* pItem)
   {
      // If cache isn't full, return object to cache
      if (mMaxCacheSize > mCache.size() &&
          NULL != pItem)
      {
         mCache.push_back(pItem);
      }
      else
         delete pItem;
   }

   void Clear()
   {
      while (false == mCache.empty())
      {
         // Pop him off
         T* pItem = mCache.back();
         mCache.pop_back();

         // Release
         delete pItem;
      }
   }

   unsigned int GetMaxCacheSize() const
   {
      return mMaxCacheSize;
   }

   unsigned int GetCurrentCacheSize() const
   {
      return mCache.size();
   }

private:

   // Private data
   unsigned int     mMaxCacheSize;
   std::vector<T*>  mCache;
};