ManicMarble
Erfahrenes Mitglied
Guten Abend zusammen,
ich hätte mal eine grundsätzliche Verständnisfrage zur Windows API. Ich programmiere zwar in diesem Fall nicht mit C/C++, aber ich schätze mal, hier sind die meisten Leute versammelt, die sich mit der Windows Speicherverwaltung besser auskennen als ich.
Ich schreibe eine DLL, die große Blöcke an Speicher alloziiert, vollschreibt und wieder freigibt. Ich habe dazu in meiner API-Bibel nachgelesen und zunächst GlobalAlloc/GlobalFree verwendet. Ich habe eine kleine Test-DLL geschrieben und deren Treiben mit einem Memory-Monitor beobachtet. Es hat sich gezeigt, dass GlobalFree offensichtlich den Speicher nicht wieder freigibt, zumindest nicht sofort!
Die Test-App. läuft auf einem Win'98-System mit 512MB RAM und 1,7GB verfügbarem virtuellem Speicher. Ich schreibe 50 Millionen DWORDs in einen vorher hierfür mit GlobalAlloc alloziierten Speicherblock (200.000.000 Byte), danach gebe ich diesen mit GlobalFree wieder frei. Das Ganze mache ich 5 mal, dann ist der virtuelle Speicher runter auf unter 10MB. Beim 6. Durchgang schmiert dann logischerweise die Anwendung ab. Im Memory-Monitor kann man das wunderbar mitverfolgen.
Habe dann das alles umgeschrieben auf LocalAlloc/LocalFree. Jetzt kann ich dieses Spiel treiben so oft ich will. Im Memory-Monitor sieht man auch schön, wie der Speicher belegt und wieder freigegeben wird. Alles wunderbar.
Nun steht aber in meinem API-Buch: "Die durch GlobalAlloc() und LocalAlloc() alloziierten Speicherbereiche sind in der linearen 32bit-Umgebung von Win32 gleich." Das kann ja demnach so nicht stimmen, oder?
Was genau ist denn nun der Unterschied zwischen globalem und lokalem Speicher. Und was genau ist der "private Heap"? Was ist der beste Ort, um so große Speicherobjekte abzulegen? Die Daten müssen nicht von außerhalb der DLL erreichbar sein.
Über ein bischen Nachhilfe für einen echten Stümper in Sachen Speicherverwaltung würde ich mich sehr freuen.
Viele Grüße,
Martin
ich hätte mal eine grundsätzliche Verständnisfrage zur Windows API. Ich programmiere zwar in diesem Fall nicht mit C/C++, aber ich schätze mal, hier sind die meisten Leute versammelt, die sich mit der Windows Speicherverwaltung besser auskennen als ich.
Ich schreibe eine DLL, die große Blöcke an Speicher alloziiert, vollschreibt und wieder freigibt. Ich habe dazu in meiner API-Bibel nachgelesen und zunächst GlobalAlloc/GlobalFree verwendet. Ich habe eine kleine Test-DLL geschrieben und deren Treiben mit einem Memory-Monitor beobachtet. Es hat sich gezeigt, dass GlobalFree offensichtlich den Speicher nicht wieder freigibt, zumindest nicht sofort!
Die Test-App. läuft auf einem Win'98-System mit 512MB RAM und 1,7GB verfügbarem virtuellem Speicher. Ich schreibe 50 Millionen DWORDs in einen vorher hierfür mit GlobalAlloc alloziierten Speicherblock (200.000.000 Byte), danach gebe ich diesen mit GlobalFree wieder frei. Das Ganze mache ich 5 mal, dann ist der virtuelle Speicher runter auf unter 10MB. Beim 6. Durchgang schmiert dann logischerweise die Anwendung ab. Im Memory-Monitor kann man das wunderbar mitverfolgen.
Habe dann das alles umgeschrieben auf LocalAlloc/LocalFree. Jetzt kann ich dieses Spiel treiben so oft ich will. Im Memory-Monitor sieht man auch schön, wie der Speicher belegt und wieder freigegeben wird. Alles wunderbar.
Nun steht aber in meinem API-Buch: "Die durch GlobalAlloc() und LocalAlloc() alloziierten Speicherbereiche sind in der linearen 32bit-Umgebung von Win32 gleich." Das kann ja demnach so nicht stimmen, oder?
Was genau ist denn nun der Unterschied zwischen globalem und lokalem Speicher. Und was genau ist der "private Heap"? Was ist der beste Ort, um so große Speicherobjekte abzulegen? Die Daten müssen nicht von außerhalb der DLL erreichbar sein.
Über ein bischen Nachhilfe für einen echten Stümper in Sachen Speicherverwaltung würde ich mich sehr freuen.
Viele Grüße,
Martin