2012-08-04 39 views
0

的元件考慮後續的代碼:C++指針MemoryBlock中

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

+0

你的意思是你想在刪除* memblock指向那個區域後使用相同的內存區域? – 2012-08-04 11:06:02

+0

這不是真的,因爲&myObject2與&myObject1相同。不知道如何更清楚地說出來。 – jahhaj 2012-08-04 13:27:53

回答

0

您正在接受不變的變量memblock的地址。我認爲你將變量的地址與分配的內存地址混淆了。

獲取指向分配內存中特定地址的指針的方式是您在上述代碼中執行的方式,memblock + 40是指向分配的內存中的40字節地址的指針。但鑑於我認爲你正在努力做到這一點不會有所幫助。要做到這一點

的方法之一是分配處理,把手指向指針的指針。當你分配一些內存時,你也從一個單獨的地方分配一個句柄。您初始化句柄以指向分配的內存*handle = memblock + offset; return handle;。現在,當您調整堆的大小時,您可以通過所有的手柄(您將它保存在某個列表中)並重新指定它們。問題是你的程序不得不處理句柄而不是指針,這很尷尬。

+0

我正在那樣做。考慮'Object * myObject = DynamicHeap-> Allocate(sizeof(Object)); //其中* myObject是memblock + 40'問題是,一旦塊越來越大,我需要重新分配這些句柄。我目前的做法是保存地址memblock + 40(的指針。一旦分配了新的內存塊,我會遍歷所有這些指針並重新分配它們。不幸的是,指向memblock(&memblock)的指針與指向memblock + 40(&(memblock + 40))的指針相同。 – 2012-08-04 11:49:22

+0

我覺得你有些困惑。在你的代碼中,myObject不是一個句柄,它是一個指針。沒有地址指針這樣的東西。沒有明智的方法來重新分配程序代碼中的指針。對此做的唯一方法(假設我正確理解你)是通過從你的分配例程返回句柄。 'Object ** myObject = DynamicHeap-> Allocate(sizeof(Object))',在這個版本中'myObject'是一個不是指針的句柄。 – jahhaj 2012-08-04 13:15:51

+0

我剛剛閱讀了上面的擴展代碼。這對我來說可以。此評論錯誤//將與ptr_to_myObject1相同。 'ptr_to_myObject1'和'ptr_to_myObject2'的值不一樣,它們是兩個不同變量的地址,所以它們不能相同。只要嘗試打印出來,如果你不相信我。很明顯,你有一個指針變量指向的地址,並且該變量本身的地址混淆了。 – jahhaj 2012-08-04 13:23:55

0

ptr_to_memblock = & memblock。在這裏,將變量memblock的地址存儲在變量ptr_to_memblock中。 Memblock是一個存儲在某個特定地址的內存中的變量,永遠不會改變。