C++ C++;指向memoryblock元素的指针

C++ C++;指向memoryblock元素的指针,c++,memory,pointers,C++,Memory,Pointers,考虑以下代码: byte *memblock = new byte[500]; byte **ptr_to_memblock = &memblock; memblock += 40; ptr_to_memblock = &memblock; ptr_to_memblock在上述示例中始终保持相同的值。 我猜这是因为memblock的地址(带或不带偏移量)总是返回连续内存块的地址 问题是,我想实现某种廉价的动态类,在这个类中可以分配任意大小的内存并按任意顺序释放它。该类使用一

考虑以下代码:

byte *memblock = new byte[500];
byte **ptr_to_memblock  = &memblock;
memblock += 40;
ptr_to_memblock  = &memblock;
ptr_to_memblock在上述示例中始终保持相同的值。 我猜这是因为memblock的地址(带或不带偏移量)总是返回连续内存块的地址

问题是,我想实现某种廉价的动态类,在这个类中可以分配任意大小的内存并按任意顺序释放它。该类使用一个内存块(如上面的memblock),一旦内存块满了,它将被一个更大的内存块替换。问题是,我需要跟踪所有使用dynamicleap类内存的对象,因为一旦我分配了一个更大的块来用旧块替换它,我就需要重新分配程序使用的所有指针。当我的程序想要从类中获取内存时,我想通过指向返回内存的指针来实现这一点。不幸的是,指向我返回的内存的指针总是指向我内部使用的内存块的指针

有没有办法在连续内存块中获取特定地址的指针

任何答复都将不胜感激

[编辑]也许这个例子有助于理解我的问题是什么:

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

您使用的是变量memblock的地址,该地址永远不会更改。我认为您混淆了变量的地址和分配内存的地址

获取指向分配内存中特定地址的指针的方法与上面代码中的方法相同,
memblock+40
是指向分配内存中40字节地址的指针。但考虑到我认为你想做的事,这是没有用的


一种方法是分配句柄,句柄是指向指针的指针。当您分配一些内存时,您还可以从单独的位置分配句柄。初始化句柄以指向分配的内存
*handle=memblock+offset;返回手柄。现在,当您调整堆的大小时,您可以遍历所有句柄(保存在某个列表中)并重新分配它们
*handle=new\u memblock+new\u offset。问题是程序必须处理句柄而不是指针,这很麻烦。

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

您的意思是在删除指向该区域的*memblock后要使用相同的内存区域?这不是真的,'as&myObject2与&myObject1'相同。我不知道怎么说得更清楚。我正是这么做的。考虑<代码>对象*MyObjist= DyrimeHeAP->分配(SIZEOF(对象));其中*myObject是memblock+40
,问题是一旦块变大,我需要重新分配这些句柄。我目前的方法是保存地址memblock+40的指针(一旦分配了一个新内存块,我就会遍历所有这些指针并重新分配它们。不幸的是,指向memblock(&memblock)的指针与指向memblock+40(&memblock+40))的指针相同吗。我想你有点糊涂了。在你的代码中,myObject不是句柄,而是指针。没有地址指针这样的东西。在程序代码中没有合理的方法来重新分配指针。唯一的方法是这样做(假设我正确理解你)是通过从分配例程返回句柄实现的。
Object**myObject=DynamicHeap->Allocate(sizeof(Object))
,在这个版本中,
myObject
是一个句柄而不是指针。我刚刚阅读了上面的扩展代码。它对我来说很好。这个注释是错误的
//将与ptr_to_myObject1
相同。
ptr_to_myObject1
ptr_to_myObject2
的值不一样,它们是两个不同va的地址所以它们不能是相同的。如果你不相信我,就试着把它们打印出来。很明显,你有一个指针变量指向的地址,而这个变量本身的地址很混乱。