考虑以下代码:
byte *memblock = new byte[500];
byte **ptr_to_memblock = &memblock;
memblock += 40;
ptr_to_memblock = &memblock;
ptr_to_memblock 在上面的示例中将始终保持相同的值。我猜这是因为 memblock 的地址(有或没有偏移量)将始终返回连续内存块的地址。
问题在于我想实现某种 DynamicHeap 类,您可以在其中分配任意大小的内存并以任意顺序释放它。该类使用一个内存块(如上面的 memblock),一旦内存块已满,它将被更大的内存块替换。问题是我需要跟踪所有使用 DynamicHeap 类内存的对象,因为一旦我分配了一个更大的块来用旧块替换它,我需要重新分配我的程序使用的所有指针。当我的程序想要从 DynamicHeap 类获取内存时,我想通过指向我返回的内存的指针来做到这一点。不幸的是,我返回的指向内存的指针始终是指向我在内部使用的内存块的指针。
有没有办法在连续的内存块中获取特定地址的指针?
任何答案表示赞赏。
[编辑] 也许这个例子将有助于理解我的问题是什么:
//byte = typedef char
byte *memblock = new byte[sizeof(Object) * 2];
Object *myObject1 = new((Object*)memblock) Object;
Object *myObject2 = new((Object*)memblock + sizeof(Object)) Object;
Object **ptr_to_myObject1 = &myObject1;
Object **ptr_to_myObject2 = &myObject2; //will be the same as ptr_to_myObject1
byte *memblock2 = new byte[sizeof(Object) * 3];
memcpy(memblock2,memblock,sizeof(Object) *2);
*ptr_to_myObject1 = (Object*)memblock2;
*ptr_to_myObject2 = (Object*)memblock2 + sizeof(Object); //Won't work.
delete[] memblock;
memblock = NULL;
我只能重新分配指向 myObject1 的指针(因为它与地址与 memblock 相同),但我不能重新分配指向 myObject2 的指针(因为 &myObject2 与 &myObject1 相同(与 &memblock 相同))。