我有一个设置大小的内存池,并分成给定大小的段。当我删除一些数据时,它会将数据正在使用的段标记为空闲。下次我尝试分配内存但没有空间时,我通过向下移动所有数据来重新对齐内存(例如,清除前2个段,将所有数据向下移动2个块)。一切正常,但是我的问题是指向数据的指针没有变化,我不确定如何去做。
我通过向内存中的空间返回一个void *来从我的缓冲池中分配内存,假设我的缓冲池的大小可以容纳2 * sizeof(Data)。
Data* poolTest = new(pool->GetMemory(sizeof(Data))) Data(5, 5, 5);
因此该池没有引用指针poolTest。
现在,如果我这样做:
pool->Free(poolTest);
Data* poolTest2 = new(pool->GetMemory(sizeof(Data))) Data(4, 5, 5);
Data* poolTest3 = new(pool->GetMemory(sizeof(Data))) Data(3, 5, 5);
创建poolTest3会触发内存重新对齐,现在poolTest2指向与poolTest3相同的地址,而poolTest1指向poolTest2应该指向的地址。
我可能只是缺少了一些东西,或者我的结构被搞砸了,但是我真的被卡在了上面。
答案 0 :(得分:2)
重述您的问题:
我想在内存中移动数据,以便为新分配腾出空间。如何确保现有的指针仍指向正确的位置?
您不能,除非您跟踪所有指针(例如,使用数组),而不是像这样访问数据:
*direct_ptr
您现在必须执行此操作:
*ptr_map[indirect_ptr]
每次移动时,都需要相应地修改ptr_map。
该数组的行为应类似于堆栈。您也许可以编写一个指针包装器类,该类在构造函数中增加一些全局/静态索引,在析构函数中减少它。
它可以节省一些空间,但对计算机而言效率低下,对程序员而言则是一团糟。
如果要进行自己的内存管理,请确保签出:
https://en.wikipedia.org/wiki/Buddy_memory_allocation
https://en.wikipedia.org/wiki/Slab_allocation
对现有技术有一个很好的概述: