Freien Hauptspeicher abfragen, nach Anlegen einiger Zeiger
-
Im Forum gesucht, nichts gefunden. Aber sicherlich simple Aufgabe:
Will einige Zeiger anlegen (new) und löschen (delete). Zwischendurch will ich auf dem Bildschirm (Konsole) ausgeben, wie viel Speicher noch frei ist. Will also nachschauen, ob der Speicher durch "delete" wieder freigegeben wurde. Tipps?
-
Wieviel Speicher auf deinem Computer noch frei ist, kannst du nur Systemabhängig ermitteln.
Unter Windows kannst du das so machen:
#include <windows.h> #include <iostream> int main() { MEMORYSTATUS status; GlobalMemoryStatus( &status ); std::cout << "Freier Speicher (in mb): " << status.dwAvailVirtual / 1024 / 1024; }
-
Genau das suchte ich. Am Besten halt aber nicht in MB, sondern in Byte... . Wird wohl was mit der 1024 am Ende zu haben, oder?
-
Ich glaube so genau kriegts du das nicht hin.
Du müsstest den speicherverbrauh des momentanen prozesses irgendwie auslesen.
Wenn dus global ausließt verfälschen andere prozesse das ergebnis.du hast mitunter weniger Speicher frei als vor dem delete. Weil ein anderer prozess gerade etwas mehr braucht.
Eine andere möglichkeit wäre jedoch, den angeforderten speicher entsprechend groß zu machen, damit man den unterschied deutlich merkt.
-
Oh, ich fürchte, Du hast recht. Aber den Rest werde ich dann wohl hinbekommen. Jedenfalls vielen Dank für die Hilfe!
-
Hallo noch mal...
Was mir erst nicht aufgefallen war ist, dass "static.dwTotalPhys" mir den gesamten Speicher, nicht den freien Speicher anzeigt. Der Speicher variiert auch nicht. Gar nicht... .Nur bei "status.dwAvailPhys" zeigt er mir einen Wert an, der hinkommen könnte. Allerdings variiert dieser auch nicht.
-
Post mal den code!
Dann siehts man am besten wo der fehler ist
-
Alex77 schrieb:
Tipps?
Ja, besorg Dir einen Speicher-Profiler und lass den das machen, dafür sind die Dinger schließlich da.
-
#include <windows.h> #include <iostream> using namespace std; int main() { MEMORYSTATUS status, status2; GlobalMemoryStatus( &status ); std::cout << "Freier Speicher (in mb): " << status.dwAvailPhys <<"\n"; int *y = new int; *y=10; GlobalMemoryStatus( &status2 ); std::cout << "Freier Speicher (in mb): " << status.dwTotalVirtual; cin.get(); }
-
Lies mal nochmal meinen post bezüglich der große des anzuforderten speichers!
Ein int hat 4 byte (normalerweise) 4byte von ich nehm mal an 512 oder 1024 MegaByte also grop über den Daumen 100.000.000mal so viel. Da ists klar das der unterschied nicht da ist.
-
@nman: Also mit massif müsste ich das dann wohl erreichen. Leider scheint es das Tool nur für Linux zu geben.
Hatte zuvor noch nie von solchen Tools gehört... . Werde dann wohl mal googeln. Außer, Du hast ein Tool für Windows parat?
-
@Storm.Xapek.de:
Hast ja recht. Allerdings habe ich im Gegensatz zu Deinem Code jeweils das Teilen von "/1024 / 1024" rausgenommen. Sah mir nun nach Bytes aus. Kann mich natürlich irren.
-
Nochmal du musst die Sache anders angehen.
Entweder du ermittelst den verbrauch deines test-prozesses.
Oder du machst den speicher den du anforderst entsprechend groß sodass er ins gewicht fällt.Mit der ausgabe hat das nichts zu tun, ob es jetzt MB oder byte sind, es kommt drauf an was man besser lesen kann (PS: der code war nicht von mir)
int *specher = new int[1000000]; //8MB speicher wenn ich richtig gerechnet hab
so inetwa würd ich sagen, dann merkst du vll. auch einen unterschied.
-
Tatsache, musste wirklich nur groß genug sein! Danke!
#include <windows.h> #include <iostream> using namespace std; int main() { MEMORYSTATUS status; GlobalMemoryStatus( &status ); std::cout << "Freier Speicher (in mb): " << status.dwAvailVirtual <<"\n"; int *test = new int[1000000]; //8MB speicher wenn ich richtig gerechnet hab GlobalMemoryStatus( &status ); std::cout << "Freier Speicher (in mb): " << status.dwAvailVirtual <<"\n"; delete []test; GlobalMemoryStatus( &status ); std::cout << "Freier Speicher (in mb): " << status.dwAvailVirtual; cin.get(); }
Ausgabe:
2138730496
2134728704
2138730496
-
Ohh sind nur 4MB,mein Fehler ein int hat 4byte weis auch nciht wie cih auf 8 gekommen bin
Hauptsache dein programm läuft
-
Alex77 schrieb:
Außer, Du hast ein Tool für Windows parat?
Nein, sorry, ich habe kein Windows, keine Ahnung, was man da verwendet.
-
Die Speicherverwaltung in deiner Standardbibliothek fordert immer einen größeren Block vom Betriebssystem an und teilt dir dann davon zu, da Speicheranforderung recht teuer ist.
Daher musst du (wie du auch festgestellt hast) einen größeren Block anfordern, der die Speicherverwaltung zwing vom Betriebssystem neuen Speicher anzufordern.Um den Speicherverbrauch festzuhalten verwende ich die Debug-Helfer von meiner VC-CRT.
-
@Any: Verstehe leider immer noch nicht, warum der Compiler einen größeren Speicherblock reserviert. Näheres würde mich aber doch interessieren. Worunter muss ich da googeln, oder könntest Du mir das noch einmal näher erklären?
Bedeutet "teuer" hier, dass es viel Rechenzeit kostet? ..und dadurch ähnlich einem Vektor einfach lieber gleich mehr Speicher reserviert wird, der dann kommenden Zeigern zugute kommt?
-
Ja läuft auf das gleiche hinaus.
-
Ja, vielen Dank Euch allen. Habt mir sehr geholfen.