VirtualAlloc bzw. HeapAlloc
-
malloc benutzt RtlAllocateHeap
-
__username schrieb:
malloc benutzt RtlAllocateHeap
Nein. Es benutzt "HeapAlloc" (siehe malloc.c, Zeile 54), was aber intern das gleiche ist wie "RtlAllocateHeap"...
-
OllyDbg sagt RtlHeapAlloc, aber ist ja egal.
Aber gibts da jetzt noch Vorteile, die für VirtualAlloc sprechen, außer, dass es seine Ex-Version gibt?
-
Mich würde noch intressieren was der Unterschied zwischen malloc() und HeapAlloc() ist?
-
Eigentlich bei neueren VC Versionen keiner mehr.
Da gibt es nur einen entscheidenden Unterschied in der Debug-Version.
-
Martin Richter schrieb:
Eigentlich bei neueren VC Versionen keiner mehr.
Da gibt es nur einen entscheidenden Unterschied in der Debug-Version.
Und was für einen?
-
hallo-ihr schrieb:
Mich würde noch intressieren was der Unterschied zwischen malloc() und HeapAlloc() ist?
Es gibt keinen. malloc allokiert (in der Debug-Version) nur noch etwas mehr um noch einige Verwaltungs-Infos abzulegen...
Aber wie gesagt: malloc ruft intern HeapAlloc auf.
Schau Dir doch einfach den Source der CRT an...
-
Dann wird HeapAlloc wohl die bessere Wahl für mich sein.
Aber eine Frage habe ich noch:
Wenn ich V-Alloc benutze, bekomme ich ja etwas mehr Speicher reserviert als ich wollte, da ganze Seiten reserviert werden.
Heißt das dann, dass HeapAlloc keine ganzen Seiten reserviert? Oder wird der "Rest" der Seite einfach ignoriert?
-
Gängige Heap-Implementierungen allokieren Seiten vom Betriebssystem und geben Teile davon weiter an die Anwendung. Wenn also eine Anforderung weniger als eine Seite verbraucht, wird bei der nächsten Anforderung eben der Rest der Seite zugewiesen. Das genau ist u.a. der Job einer Heap-Implementierung.
Wenn Du also wirklich eine eigene Heap-Implementierung schreiben möchtest, nimm VirtualAlloc und teile die Seiten dann in kleinere Häppchen ein, die Deine Allokationsfunktion zurückgibt.
-
Aber was wäre denn, wenn HeapAlloc Speicher reserviert und einen Teil zurückgibt. Dann hat HeapAlloc für den nächsten Aufruf noch "ein wenig" Speicher frei. Aber wenn zwischenzeitlich z.B. per VirtualAlloc Speicher reserviert wird, entsteht doch eine Lücke.
Ungefähr so stelle ich mir das vor:[|Reservierter Speicher| |Lücke bis zur nächsten Page| |VirtualAlloc Speicher| |Reservierter Speicher| |Lücke bis zur nächsten Page| |...]
Dann würde ja der Speicher nach und nach ziemlich fragmentiert sein, oder?
Hoffe meine Frage ist verständlich
-
Was wäre wenn Du Dir die Doku dazu durchliest?
Andernfalls kann man auch ein lustiges Ratespiel draus machen.
Eine Frage wäre, wieviel Speicherlöcher kann man mit VirtualAlloc bauen, wenn der Luftdruck unter 820 hPa fällt.Man baut entweder mit HeapAlloc und/oder VirtualAlloc. Nutzt man beides zusammen, gibts für jede Funktion einen unterschiedlichen Speicherbereich. Versucht man eine auf den Speicherbereich allokiert durch die andere anzuwenden siehe RTFM.
Man gibt den Speicher frei mit VirtualFree oder HeapFree.
Möchte man den allokierten Speicher vergrößern, so gibt es für die Heap-Funktionalität ein HeapReAlloc. Diese fluppt aber nur für Heap-Du-weißt-schon. Wie es bei VirtuallAlloc läuft verrät Dir die MSDN.
Wie die sich verhält und was die mit den Löchern anstellt, siehe Dokumentation.
-
RTFM (Read the fine MSDN).
VirtualAlloc ist tiefer gelagert als HeapAlloc. Intern benutzt HeapAlloc VirtualAlloc...
-
RTFM (Read the fine MSDN)
Klasse den kannte ich noch nicht
-
fine MSDN hab ich gelesen
Also kann man abschließend sagen: HeapAlloc = VirtualAlloc + Managment ?
Das man entweder die eine Funktion oder die andere benutzt ist mir klar, die Sache ist nur, dass ich eine DLL schreibe. Was ich aufrufe und was der DLL-User aufruft, sind aber möglicherweise zwei verschiedene Dinge...
-
__username schrieb:
Was ich aufrufe und was der DLL-User aufruft, sind aber möglicherweise zwei verschiedene Dinge...
Und inwiefern ist was der User aufruft für dich relevant?
-
Man baut entweder mit HeapAlloc und/oder VirtualAlloc. Nutzt man beides zusammen, gibts für jede Funktion einen unterschiedlichen Speicherbereich
War nur darauf bezogen
-
__username schrieb:
fine MSDN hab ich gelesen
Also kann man abschließend sagen: HeapAlloc = VirtualAlloc + Managment ?
Das man entweder die eine Funktion oder die andere benutzt ist mir klar, die Sache ist nur, dass ich eine DLL schreibe. Was ich aufrufe und was der DLL-User aufruft, sind aber möglicherweise zwei verschiedene Dinge...
Ja und?
Ein gutes DLL Interface ist in jedem Fall so aufgebaut, dass nur das Interface Daten allokiert und freigibt und der User damit nichts zu tun hat. Also mach was Du willst und der Nutzer Deiner DLL braucht nicht zu wissen was Du machst.
-