我正在实现一个内存池类型的类。其中一个方法分配B字节的内存并向其返回一个空指针,同时在内部处理缓冲区并在旧内存中移动,以确保对象在其生存期内管理的所有内存都是连续的(类似于std::vector将有一个预先分配的缓冲区,并在缓冲区用完后分配额外的空间,将信息从旧缓冲区复制到新缓冲区以确保所有内存是连续的)。我的问题是,我如何确保或检查所有分配的内存是连续的?如果我想使用手动从一个对象跳到另一个对象
static_cast<desired_type*>(buffer_pointer + N)
如果对象的位置偏移了某个量,而不仅仅是以前对象大小的总和,那么这种方法自然会失败。我是编写自定义内存池的新手,所以我只是想知道,我如何确保分配的内存是非碎片的,或者访问新碎片的位置,以便仍然可以手动索引malloc()-ed内存块?非常感谢。
如果我理解你的问题,你会问你是否可以多次调用malloc返回连续内存。
答案是否定的,内存在多个malloc之间不会是连续的,因为大多数内存管理器都会在分配的内存周围放置头/尾数据,以进行自己的管理,并在边缘放置保护标记以检测溢出——细节在很大程度上取决于实现。
对于您自己的内存管理,您需要使用malloc分配一个足够大的块,然后将其拆分并自己管理内部。
您可以将此github项目视为所需管理的一个示例:https://github.com/bcorriveau/memblock