如何在C++中创建一个自定义的MemoryManager来管理给定的连续内存块,而不依赖其他内存管理器(如Malloc / New)?
下面是更多背景信息:
MemManager::MemManager(void* memory, unsigned char totalsize)
{
Memory = memory;
MemSize = totalsize;
}
我需要能够使用MemManager分配和释放这块连续内存的块。构造函数给出了块的总大小(以字节为单位)。
Allocate函数应该接受所需内存量(以字节为单位)并返回指向该内存块开头的指针。如果没有剩余内存,则返回空指针。
Deallocate函数应该接受指向必须释放的内存块的指针,并将其返回给MemManager以供将来使用。
请注意以下限制:
-除了给它的内存块之外,MemManager不能使用任何动态内存
-按照最初的规定,MemManager不能使用其他内存管理器来执行其功能,包括new/malloc和delete/free 我已经在几次工作面试中收到过这个问题,但是即使在网上进行了数小时的研究,也没有帮助我,而且我每次都失败了。我找到了类似的实现,但它们要么使用了malloc/new,要么是通用的,并从操作系统请求内存,这是我不允许做的。
请注意,我习惯于使用malloc/new和free/delete,使用它们时很少遇到麻烦。
我尝试过使用LinkedList方式中的节点对象实现,该节点对象指向分配的内存块并说明使用了多少字节。但是,使用这些实现时,我总是被迫在堆栈上创建新节点并将它们插入列表中,但是一旦它们超出范围,整个程序就会崩溃,因为地址和内存大小已丢失。
如果有人有某种实现这样东西的想法,我将不胜感激。先谢谢了!
编辑:我忘记在原始帖子中直接指定这一点,但使用此MemManager分配的对象可以具有不同的大小。
编辑2:最终我使用了同质内存块,这实际上非常容易实现,得益于下面答案提供的信息。没有指定实现本身的确切规则,因此我将每个块分成8个字节。如果用户请求的字节数大于8,则无法给出,但是如果用户请求的字节数少于8(但> 0),则会给出额外的内存。如果传入的内存量不能被8整除,则末尾会有浪费的内存,我认为这比使用比所给的内存更多的内存要好得多。