次のコードを検討してください。
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 と同じ) と同じであるため)。