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

ptr_to_memblock = &memblock. ここでは、変数 memblock のアドレスを変数 ptr_to_memblock に格納します。Memblock は、変更されることのない特定のアドレスのメモリ内のどこかに格納される変数です。

于 2012-08-04T11:19:44.807 に答える
0

変更されることのない変数 memblock のアドレスを取得しています。変数のアドレスと割り当てられたメモリのアドレスを混同していると思います。

割り当てられたメモリ内の特定のアドレスへのポインタを取得する方法は、上記のコードで行っている方法でありmemblock + 40、割り当てられたメモリ内のアドレス 40 バイトへのポインタです。しかし、あなたがやろうとしていることを考えると、これは役に立ちません。

これを行う 1 つの方法は、ハンドルを割り当てることです。ハンドルはポインターへのポインターです。メモリを割り当てると、別の場所からハンドルも割り当てられます。割り当てられたメモリを指すようにハンドルを初期化します*handle = memblock + offset; return handle;。ヒープのサイズを変更すると、すべてのハンドル (どこかのリストに保持している) を調べて、それらを再割り当てできます*handle = new_memblock + new_offset;。問題は、プログラムがポインタの代わりにハンドルを扱わなければならないことです。これは厄介です。

于 2012-08-04T11:12:45.663 に答える