關鍵詞 內存池 鏈表
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調用的是系統傳遞的malloc
m_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);
}