在特定内存地址处创建堆以进行动态内存分配

时间:2012-11-03 15:43:53

标签: c++ c embedded heap dynamic-memory-allocation

是否有办法在可用于动态内存分配的特定内存位置(与系统堆分开)创建堆,但使用内置于C库中的动态内存分配器。

我正在寻找与此功能相同的东西:

UserHeap heap(startAddress, size);

void* allocatedMemory1 = heap.Allocate(100);  //Allocate 100 bytes.
void* allocatedMemory2 = heap.Allocate(200);  //Allocate 200 bytes.

/* ... Do seomthing useful with the memory ... */

heap.Free(allocatedMemory1);
heap.Free(allocatedMemory2);

uheap.h似乎有我正在寻找的东西,但这似乎并不存在于newlib中。我想知道GCC或newlib是否有某些东西。如果不是,我想我可能最终移植ptmalloc。但是,我的理解是这个代码已经存在于C库中了,我讨厌浪费再现它的记忆。

我使用Sourcery Codebench Lite(GCC)和newlib(C库)。

2 个答案:

答案 0 :(得分:1)

推出自己的分配器并不是那么难,而且在很多方面都非常有启发性。 首先,您需要确定要在该堆中支持哪种分配/解除分配模式。对于一般用途,类似于dlmalloc(Doug Lea' s)的分配器非常好。 对于特定用法还有更多种类:基于堆栈(其中free是始终是最后分配的不同内存块的地址),基于固定大小(其中内存按固定大小划分,返回),基于队列,小块等等。

其中大多数也可以有一个内部分配器,例如假设你有一个固定大小的分配器,你可以告诉它分配X字节的块(来自第二个分配器或来自系统),然后分成Y字节块。返回大小为Y字节的块的指针,但是如果没有空闲块,则分配一个大小为X的新块并将其分开。

为方便起见,您还可以在全局或某些类上实现新的/删除操作符,以将其分配重定向到自定义分配器。 堆上新放置也很方便,见下文。

我个人更喜欢使用宏,因为它允许非常容易地添加额外的调试信息(函数/行/等)。即:

#define CUSTOM_NEW(Heap) new(Heap, __FUNCTION__, __LINE__)
int* ptr = CUSTOM_NEW(someHeap) int[32];

答案 1 :(得分:0)

我终于遇到了Eli Bendersky的一篇博客,它正好说明了我在寻找什么。 memmgr – a fixed-pool memory allocator