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