在 C 中没有使用标记/释放内存分配的标准方法。如果您知道所有malloc
/ free calls will be used in a LIFO fashion, you may be able to link in your own
malloc /
free 函数使用类似以下内容的事实:
#define MY_HEAP_SIZE 12345678
unsigned char my_mem[MY_HEAP_SIZE];
unsigned char *my_alloc_ptr = my_mem;
void *malloc(size_t size)
{
void *ret = my_alloc_ptr;
if (size <= MY_HEAP_SIZE && ((my_alloc_ptr - my_mem)+size) <= MY_HEAP_SIZE)
{
my_alloc_ptr += size;
return (void*)ret;
}
else
return (void*)0;
}
void free(void *ptr)
{
if (ptr)
my_alloc_ptr = ptr;
}
这种方法要求每个分配块的开销为零,但调用free()
任何块也将释放以后分配的所有块。如果外部代码不malloc/free
按 LIFO 顺序使用,则可以使用另一种方法,但如果在您的代码这样做之前不释放块,则可以free()
不做任何事情,但有一些其他功能像free
上面一样。更复杂的变化也是可能的,但在第一种方法就足够的情况下,它的效率是无可匹敌的。非常适合嵌入式系统(尽管我通常将其称为 malloc 以外的其他名称)。