关键词 内存池 链表
class A
{
public:static void* operator new(size_t size);static void operator delete(void* phead);static int m_iCout;//分配计数统计,每new一次,就统计一次static int m_iMallocCount;//每次malloc一次,统计一次private:A* next;static A* m_FreePost;//总是指向一块可以分配出内存的首地址static int m_sTrunkCout;//一次分配多少倍的该类内存
};int A::m_iCout = 0;
int A::m_iMallocCount = 0;
A* A::m_FreePost = nullptr;
int A::m_sTrunkCout = 5;//一次分配五倍的该类内存作为内存池的大小void* A::operator new(size_t size)
{A* temp;if (m_FreePost == nullptr){//申请一大块内存size_t realsize = m_sTrunkCout * size;//传动new调用的是系统传递的mallocm_FreePost = reinterpret_cast<A*>(new char[realsize]);temp = m_FreePost;//把分配出来的一大块内存,彼此关联起来,供后续使用for (; temp != &m_FreePost[m_sTrunkCout - 1]; ++temp){temp->next = temp + 1;}temp->next = nullptr;++m_iMallocCount;}temp = m_FreePost;m_FreePost = m_FreePost->next;//更新可用内存块地址++m_iCout;return temp;}void A::operator delete(void* phead)
{(static_cast<A*>(phead)->next) = m_FreePost;m_FreePost = static_cast<A*>(phead);
}