📄 heap.cpp
字号:
//: HEAP.CPP --- a memory manager
#include<malloc.h>
#include<stdlib.h>
#include"heap.h"
CHeap::CHeapUnit CHeap::heap[CHeap::MAX_HEAP]={CHeap::CHeapUnit()};
unsigned CHeap::HeapCount=0;
unsigned CHeap::HaveSpace=0;
bool CHeap::MemUseUp=false;
#ifndef LOCALHEAP
CHeap GlobalHeap;
#endif
CHeap::CHeap(size_t t)
{
HaveSpace=0;
HeapCount=0;
MemUseUp=false;
TempStartUnit=0;
TempStartLocation=NULL;
TempLocationSetted=false;
unsigned s=((t-1)/HEAP_UNIT+1);
s=(s>MAX_HEAP)?MAX_HEAP:s;
for(unsigned i=0;i<s;i++)
{
if (heap[i].GetMem(HEAP_UNIT))
HeapCount++;
else
{
MemUseUp=true;
return;
}
}
}
CHeap::~CHeap(void)
{
for(unsigned i=0;i<HeapCount;i++)
heap[i].FreeMem();
}
void *CHeap::operator new(size_t s)
{
if (s<=HEAP_UNIT)
{
char *p;
for(unsigned i=HaveSpace;i<HeapCount;i++)
{
p=heap[i].alloc(s);
if (p)
{
if ((i==HaveSpace)&&(heap[i].Remain()<=MIN_SPACE))
HaveSpace++;
return p;
}
}
bool b=heap[i].GetMem(HEAP_UNIT);
if (b)
{
HeapCount++;
p=heap[i].alloc(s);
if ((i==HaveSpace)&&(heap[i].Remain()<=MIN_SPACE))
HaveSpace++;
return p;
}
}
MemUseUp=true;
return malloc(s);
}
void CHeap::operator delete(void *space)
{
if (!MemUseUp)
return ;
for(unsigned i=0;i<HeapCount;i++)
{
if (heap[i].IsHere(space))
return;
}
free(space); // if the space is get by malloc function
}
void CHeap::HeapReset()
{
FreeAll();
if (heap[0].GetMem(HEAP_UNIT))
HeapCount++;
else
{
MemUseUp=true;
return;
}
}
void CHeap::FreeAll()
{
if (MemUseUp)
return;
for(unsigned i=0;i<HeapCount;i++)
heap[i].FreeMem();
HeapCount=0;
HaveSpace=0;
MemUseUp=false;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -