Heap Copy
-
Hi,
ich habe eine Strucktur die mit HeapCreate einen Private Heap erzeugt.
Weiter habe ich in dieser Strucktur einen void* ptr der für ein einzelnes Array dienen kann, oder nach wunsch als MemoryMap für weitere ptrs welche dann durch den zugriff per index auf den dementsprechenden Speicher im Heap zugreifen.Angenommen die größe des PrivateHeap reicht für die ganzen objecte nicht aus, dann will ich ja auch den Heap vergrößen, und nicht nur den Speicherbereich für jeden einzelnen ptr. da der gesammte private Heap ja immerhin zu klein geworden ist.
Also soll ein neuer größerer Heap erstellt werden und aus dem alten der ganze Inhalt nach dem neuen Portiert werden.
Was man machen kann ist, enum blocks, vergleiche addresse aus HeapA.ptr[i], wenn übereinstimmt, allociere in HeapB und setze HeapB.ptr[i]=addresse.
(Wobei ja schon der ptr[] im HeapB allociert wurde)..Gibt es einen effizienteren Weg?
Seid gegrüßt
-
Jo,..
Man natürlich auch HeapCreate ohne fixe größe angeben,...
Meine frage bezieht sich aber Allocierten Heap mit fixer größer..grüüüße

-
Was versprichst Du Dir überhaupt von diesem privaten Heap, wenn Du nicht kalkulieren kannst wir goß er ist.
Du kannst eine doppelte Verketteing nehmen. Du hast einen Array von Zeigern. In diesem Array steht die eigentliche Adresse drin. Du vergibst nur den Slot. Zugriff ergolt dann über **... Da sganze bekommt man mit Smart-Pointere relativ einfach hin.
Wen die Heapobjekte umgelegt werden müssen. Musst Du nur die physikalischen Adressen in dem Basisarray tauschen.
Vor allem umgehst Du damit das Problem, dass ein Pointer zweimal verwendet werden kann, oder gar mehrfach.
-
Jo martin,
ich dachte genau das hätte ich geschrieben?
Das "Basis Array" (oben auch als MemoryMap bezeichnet), liegt aber auch im Private Heap ,... nur der pointer darauf nicht.
class Bla { private: LP_TYP_X _ptr; HANDLE hEap; public: ....Ich verstehe nicht ganz das nur die Addressen umgelegt werden müssen ? Ich kenne die Fragmentation doch nur wenn ich die HeapBlocks enummeriere, und wenn ich den Heap als ganzes kopiere wurde _ptrA nicht mehr mit _ptrB übereinstimmen und somit könnte ich auch nicht einfach nur die adressen tauschen ?
Weißt Du was ich meine? (Falls ich die geforderten Randbedingungen präzesieren soll, sag ruhig bÖscheid...)
(Achso: Die größe will ich ja laufzeit dynamisch "selbstkontrollierend" ändern, bekannt ist diese aber zum zeitpunkt der änderung..)
Sei gegrüßt
--------------------------
edit:
enumaration über HeapWalk oder indizerung von _ptrA.....