// Note : Simple List Memory Pool -_-;;;; // ³ªÁß¿¡ ÀÎÅÍÆäÀ̽ºÂÊ¿¡¼­ »ç¿ëÇϱâ À§ÇØ Ãß°¡. // #pragma once #include #include template class CSLMemPool { protected: struct DeleteObject { template void operator() ( const TYPE *ptr ) const { ASSERT(ptr&&"CMemPool::operator()"); delete ptr; } }; typedef typename std::list MEMPOOL_LIST; typedef typename MEMPOOL_LIST::iterator MEMPOOL_LIST_ITER; MEMPOOL_LIST m_listMemPool; public: CSLMemPool(); ~CSLMemPool(); public: // Note : ¸Þ¸ð¸®¸¦ ÇÒ´çÇÑ´Ù. // Ç®¿¡ ÀÖ´Ù¸é Ç®¿¡ ÀÖ´Â ¸Þ¸ð¸®¸¦ ¹ÝȯÇÏ°í ¾Æ´Ï¸é newÇÑ´Ù. TYPE* Allocate(); // Note : ¸Þ¸ð¸®Ç®¿¡ ¹ÝȯÇÑ´Ù. °´Ã¼´Â ÀÌÀü °ªÀ» °¡Áø´Ù. // Ç®¿¡ ¹ÝȯÇϱâ Àü ¶Ç´Â ÈÄ¿¡ ÃʱâÈ­¸¦ ÇÏ°í »ç¿ëÇØ¾ß ÇÑ´Ù. void Deallocate( TYPE* ptr ); // Note : ¸Þ¸ð¸®Ç®¿¡ ¹ÝȯÇÑ´Ù. ´Ü °´Ã¼¸¦ »ý¼ºÀÚ·Î ÃʱâÈ­ ÈÄ ¹Ýȯ. void DeallocateEx( TYPE* ptr ); public: DWORD GetAmount() { return static_cast(m_listMemPool.size()); } void Clear() { std::for_each ( m_listMemPool.begin(), m_listMemPool.end(), DeleteObject() ); } }; template inline CSLMemPool::CSLMemPool() { } template inline CSLMemPool::~CSLMemPool() { Clear(); } template inline TYPE* CSLMemPool::Allocate() { if( m_listMemPool.empty() ) { return new TYPE; } TYPE* ptr = *m_listMemPool.begin(); m_listMemPool.pop_front(); ASSERT(ptr&&"CMemPool::Allocate"); return ptr; } template inline void CSLMemPool::Deallocate( TYPE* ptr ) { ASSERT(ptr&&"CMemPool::Deallocate"); m_listMemPool.push_back ( ptr ); } template inline void CSLMemPool::DeallocateEx( TYPE* ptr ) { ASSERT(ptr&&"CMemPool::DeallocateEx"); *ptr = TYPE(); m_listMemPool.push_back ( ptr ); }