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