0

考虑以下代码:

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 相同))。

4

2 回答 2

0

您正在获取变量 memblock 的地址,该地址永远不会改变。我认为您将变量的地址与分配的内存的地址混淆了。

获取指向分配内存中特定地址的指针的方法是您在上面的代码中执行的方式,memblock + 40是指向分配内存中 40 字节地址的指针。但是鉴于我认为您正在尝试这样做,这将无济于事。

一种方法是分配句柄,句柄是指向指针的指针。当你分配一些内存时,你也会从一个单独的地方分配一个句柄。您初始化句柄以指向分配的内存*handle = memblock + offset; return handle;。现在,当您调整堆大小时,您可以遍历所有句柄(您已将其保存在某个列表中)并重新分配它们*handle = new_memblock + new_offset;。问题是您的程序必须处理句柄而不是指针,这很尴尬。

于 2012-08-04T11:12:45.663 回答
0

ptr_to_memblock = &memblock. 这里将变量 memblock 的地址存储在变量 ptr_to_memblock 中。Memblock 是一个存储在内存中某个特定地址的变量,它永远不会改变。

于 2012-08-04T11:19:44.807 回答