修正堆释放后Used计算错误,不能用下一块指针减去当前指针,因为最后一块可能没有用完

This commit is contained in:
大石头X2 2017-02-25 15:14:52 +08:00
parent 757fac6cd7
commit 4d8d16972f
2 changed files with 28 additions and 6 deletions

View File

@ -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;

View File

@ -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;