修正堆释放后Used计算错误,不能用下一块指针减去当前指针,因为最后一块可能没有用完
This commit is contained in:
parent
757fac6cd7
commit
4d8d16972f
|
@ -5,6 +5,9 @@
|
|||
|
||||
#define MEMORY_ALIGN 4
|
||||
|
||||
// 当前堆
|
||||
Heap* Heap::Current = nullptr;
|
||||
|
||||
/*
|
||||
堆分配原理:
|
||||
1,使用内存块,记录当前块已使用大小以及下一块地址,形成内存块链表
|
||||
|
@ -25,6 +28,8 @@ typedef struct MemoryBlock_
|
|||
/******************************** Heap ********************************/
|
||||
Heap::Heap(uint addr, uint size)
|
||||
{
|
||||
Current = this;
|
||||
|
||||
// 地址对齐
|
||||
uint end = addr + size;
|
||||
addr = (addr + MEMORY_ALIGN - 1) & (~(MEMORY_ALIGN - 1));
|
||||
|
@ -42,10 +47,13 @@ Heap::Heap(uint addr, uint size)
|
|||
|
||||
_Used = sizeof(MemoryBlock) << 1;
|
||||
_Count = 0;
|
||||
|
||||
debug_printf("Heap::Init(%p, %d) Free=%d \r\n", Address, Size, FreeSize());
|
||||
}
|
||||
|
||||
uint Heap::Used() const { return _Used; }
|
||||
uint Heap::Count() const { return _Count; }
|
||||
uint Heap::FreeSize() const { return Size - _Used; }
|
||||
|
||||
void* Heap::Alloc(uint size)
|
||||
{
|
||||
|
@ -58,14 +66,19 @@ void* Heap::Alloc(uint size)
|
|||
return nullptr;
|
||||
}
|
||||
|
||||
// 检查头部完整性
|
||||
auto head = (MemoryBlock*)Address;
|
||||
assert(head->Used <= Size && (uint)head + head->Used <= (uint)head->Next, "堆头被破坏!");
|
||||
assert(_Used <= Size, "Heap::Used异常!");
|
||||
|
||||
void* ret = nullptr;
|
||||
int need = size + sizeof(MemoryBlock);
|
||||
|
||||
SmartIRQ irq;
|
||||
for(auto mcb=(MemoryBlock*)Address; mcb->Next!=nullptr; mcb=mcb->Next)
|
||||
{
|
||||
// 找到一块满足大小的内存块
|
||||
int free = (uint)mcb->Next - (uint)mcb - mcb->Used;
|
||||
// 找到一块满足大小的内存块。计算当前块剩余长度
|
||||
int free = (int)mcb->Next - (int)mcb - mcb->Used;
|
||||
if(free >= need)
|
||||
{
|
||||
// 割一块出来
|
||||
|
@ -79,6 +92,8 @@ void* Heap::Alloc(uint size)
|
|||
_Used += need;
|
||||
_Count++;
|
||||
|
||||
debug_printf("Heap::Alloc (%p, %d) Used=%d Count=%d \r\n", ret, need, _Used, _Count);
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -96,11 +111,14 @@ void Heap::Free(void* ptr)
|
|||
SmartIRQ irq;
|
||||
for(auto find=prev->Next; find->Next!=nullptr; find=find->Next)
|
||||
{
|
||||
// 找到内存块
|
||||
if(find == mcb)
|
||||
{
|
||||
_Used -= (uint)find->Next - (uint)prev->Next;
|
||||
_Used -= find->Used;
|
||||
_Count--;
|
||||
|
||||
debug_printf("Heap::Free (%p, %d) Used=%d Count=%d \r\n", ptr, find->Used, _Used, _Count);
|
||||
|
||||
prev->Next = find->Next;
|
||||
|
||||
break;
|
||||
|
|
|
@ -9,13 +9,17 @@ public:
|
|||
uint Size; // 大小
|
||||
|
||||
Heap(uint addr, uint size);
|
||||
|
||||
|
||||
uint Used() const; // 已使用内存数
|
||||
uint Count() const; // 已使用内存块数
|
||||
|
||||
uint FreeSize() const; // 可用内存数
|
||||
|
||||
void* Alloc(uint size);
|
||||
void Free(void* ptr);
|
||||
|
||||
|
||||
// 当前堆
|
||||
static Heap* Current;
|
||||
|
||||
private:
|
||||
uint _Used;
|
||||
uint _Count;
|
||||
|
|
Loading…
Reference in New Issue