我有一个固定大小的内存池,它被分成给定大小的段。当我删除一些数据时,它会将数据正在使用的段标记为空闲。下次我尝试分配内存但没有空间时,我通过向下移动所有数据来重新对齐内存(例如,前 2 个段被清除,将所有数据向下移动 2 个 block )。这一切都很好,但我的问题是我指向该数据的指针没有改变,我不确定我该如何去做。
我通过将 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 应该指向的地址。
我可能只是遗漏了一些东西,或者我的结构搞砸了,但我真的坚持这一点。
最佳答案
重新表述您的问题:
我想在内存中移动数据以为新分配腾出空间。如何确保现有指针仍指向正确的位置?
你不能,除非你通过使用数组来跟踪所有指针,而不是像这样访问你的数据:
*direct_ptr
你现在必须这样做:
*ptr_map[indirect_ptr]
每次移动东西时,都需要相应地修改 ptr_map。
数组应该表现得像一个堆栈。您也许可以编写一个指针包装类,在构造函数中增加一些全局/静态索引并在析构函数中减少它。
它可能会节省一点空间,但对计算机来说效率很低,对程序员来说也很麻烦。
如果您想进行自己的内存管理,请务必查看:
https://en.wikipedia.org/wiki/Buddy_memory_allocation
https://en.wikipedia.org/wiki/Slab_allocation
以及对现有技术的良好概述:
关于c++ - 内存重新对齐后重新对齐指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53200729/