【发布时间】:2019-06-10 04:34:23
【问题描述】:
我正在实现一个内存池类型的类。其中一种方法分配 B 字节的内存并返回一个指向它的 void 指针,同时在内部处理缓冲区并在旧内存中移动以确保对象在其生命周期内管理的所有内存都是连续的(类似于 std::vector 将有一个预分配的缓冲区并在缓冲区用完后分配额外的空间,将信息从旧缓冲区复制到新缓冲区以确保所有内存都是连续的)。我的问题是,我如何确保或检查所有分配的内存是连续的?如果我希望手动从一个对象跳转到另一个对象,请使用
static_cast<desired_type*>(buffer_pointer + N)
如果一个对象的位置偏移了某个量,而不仅仅是先前对象大小的总和,则此方法自然会失败。我是编写自定义内存池的新手,所以我只是想知道,如何确保分配的内存没有碎片,或者访问新片段的位置,以便我仍然可以通过 malloc()-ed 块手动索引记忆?谢谢。
【问题讨论】:
-
唯一的解决方案是使用
malloc或new分配一个单个 块并手动管理它。或者使用预先分配的vector。 -
写你自己的分配器?
-
看来您必须管理与对象相关的所有信息(大小、位置...)
-
@duong_dajgja 是的,该类跟踪已用完的字节数和最大字节容量。我不确定该怎么做是跟踪位置。分配方法返回一个指向连续内存块开头的指针的元组(以防它由于缓冲区溢出而从先前的分配更改)和一个指向新位置开始的指针。但是,当向其中添加新内存时,我希望能够获取开始指针并按大小递增以获取每个对象的结束位置和另一个对象的开始位置,这就是为什么我想知道如何测试连续性跨度>
-
@Jean-FrançoisFabre 是的,该方法从单个 malloc 分配缓冲区,直到缓冲区溢出(从大小为 N 的缓冲区请求 N+1 个字节)。在溢出的情况下,该类将数据移动到具有足够大小的新缓冲区中。我希望能够仅从每个对象的大小和起始位置检索每个对象的位置,这应该很简单 - 只需将累积的先前大小添加到开始。但是,不确定这是否适用于碎片内存,那么有没有办法可以检查碎片,或者这不是单个 malloc 缓冲区的问题?
标签: c++ c malloc dynamic-memory-allocation allocator