我正在使用以下形式的静态结构数组模拟内存块:
typedef struct memBlock
{
unsigned int isAllocated = 0;
unsigned int processID = 0;
}memBlock;
我已经有了一个类似malloc()
的函数,它将通过从进程中获取所请求的内存大小来模拟malloc,并通过将isAllocated设置为1来标记部分数组,并更改PID到请求进程的进程ID。
所以现在我想编写一个像free
这样的函数,通过将isAllocated设置为0并将PID设置为0来从该数组中释放“memory”,但是我该如何实现呢?我从概念上知道我需要从这个数组的索引0开始,并且可能检查第一个索引,其中isAllocated = 1和非零PID对吗?
到目前为止我已经实现了这个:
void* custom_free(void* ptr, unsigned int size)
{
unsigned int blockIndex = 0, sizeCount = 0, startIndex = 0;
if(ptr){ free(ptr); }
}
编辑:在我的代码中,我有一个malloc调用memBlock结构,如下所示:
memBlock *block = (memBlock *)malloc(BLOCK_SIZE);
其中BLOCK_SIZE
是预处理器定义的常量
答案 0 :(得分:1)
分配器存储有关已分配内存块的信息的一种常用方法是将信息结构存储在它分配的内存块中。
因此,不是分配size
个字节,而是分配size + sizeof(memBlock)
个字节,并使用指针作为指向memBlock
结构的指针,并填写所需的信息。然后在memBlock
结构之后返回指向内存的指针(即类似&((memBlock *) ptr)[1]
)。
释放时,减去memBlock
结构的大小以获得指向memBlock
结构的原始指针。
这当然会使isAllocated
这样的成员变得毫无用处。如果你有自己的块,并且只分配这些块的倍数,你需要存储有关分配了哪些块的信息,以及块的数量。