C - Überprüfen Sie den verfügbaren ram?
Ich weiß, wie Sie malloc()
und free()
Speicher zuweisen, aber gibt es auch eine standard-C-Funktion, um zu überprüfen, wie viel Speicher übrig ist, so kann ich rufen, die in regelmäßigen Abständen, um sicherzustellen, dass mein code hat keine Speicherverluste?
Das einzige, was ich denken kann, ist das aufrufen malloc(1)
in einer endlos-Schleife, bis es wieder ein Fehler, aber sollte es nicht eine effizientere Möglichkeit?
Warum nicht einfach valgrind auf, Ihr Programm auf Dichtheit prüfen?
beachten Sie, dass das aufrufen von malloc in einer Endlosschleife und wird wahrscheinlich nie scheitern, da die meisten Systeme nur Speicher auf touch.
Verwandte : stackoverflow.com/questions/2513505/...
jeder
Wahr, in der Tat malloc muss auch die (physischen) Speicher zu halten Spur von den zugewiesenen Blöcken (auch wenn Sie die drop-Zeiger). So kann man nicht malloc für immer. Dies jedoch überhaupt nicht helfen, zu wissen, wie viel Speicher übrig ist.
beachten Sie, dass das aufrufen von malloc in einer Endlosschleife und wird wahrscheinlich nie scheitern, da die meisten Systeme nur Speicher auf touch.
Verwandte : stackoverflow.com/questions/2513505/...
jeder
malloc
rufen Sie behält sich einen Teil des virtuellen Adressraums, so wird es irgendwann wieder einen Fehler.Wahr, in der Tat malloc muss auch die (physischen) Speicher zu halten Spur von den zugewiesenen Blöcken (auch wenn Sie die drop-Zeiger). So kann man nicht malloc für immer. Dies jedoch überhaupt nicht helfen, zu wissen, wie viel Speicher übrig ist.
InformationsquelleAutor Muis | 2013-01-17
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nein, es gibt keine standard-C-Funktion zu tun. Es gibt einige Plattform-spezifische Funktionen, die Sie verwenden können, um bestimmte Arten von Abfragen (wie working set-Größe), aber diese werden wahrscheinlich nicht hilfreich sein, denn manchmal Speicher, wurde richtig
free()
d wird immer noch als der Zuweisung durch die OS wegen dermalloc
Umsetzung halten könnte, wird der freigegebene Speicher in einem Becken umher.Wenn Sie prüfen wollen, für Speicher-Lecks empfehle ich mit einem tool wie Valgrind, läuft dein Programm in einer virtuellen Maschine sortiert und können verfolgen, Speicher Lecks, unter anderem features.
Wenn Sie unter Windows läuft, können Sie
_CrtDbgReport
und/oder_CrtSetDbgFlag
zu prüfen auf Speicherlecks.In diesem Fall Messen Sie, wie viel Speicher Sie haben zu Beginn der Ausführung und zu schreiben wrapper-Funktionen rund um
malloc
undfree
zu Dekrementieren und Inkrementieren von Ihrem Startpunkt, als loreb schlägt vor, in einer anderen Antwort.InformationsquelleAutor Adam Rosenfield
Wenn Sie sich leisten können #ifdef ' Ing eine debug-version (eventuell in einem emulator!), Sie könnte einfach erstellen Sie eine debug-version von malloc/free, die verfolgt die Anzahl der bytes, die derzeit im Einsatz, und "drucken" Sie in regelmäßigen Abständen (wieder - nur in der debug-version, möglicherweise unter einem emulator) auf welchem Ausgabegerät Sie für das Debuggen (eine led?), und sehen, ob es hält, steigt.
Den standard-trick ist, um zu reservieren, sizeof(size_t) mehr als beantragt, so ist die Speicherung der Größe zusammen mit der neu zugewiesenen Speicher - aber wenn Sie schreiben eine firmware, die ich denke, Sie wissen es bereits 🙂
Also... hast du einen emulator?
EDIT: ich bin also verwendet, um Computer läuft GHz, dass Sie nicht mit mir kommen, auf den ersten, aber natürlich eine andere Sache, die Sie tun können, ist nur die Anzahl der Zuweisungen, die nicht Ihre Größe-ich kann mir nicht vorstellen, wie das wohl zu viel Speicher zu laufen.
InformationsquelleAutor loreb
Wenn in Ihrem system
malloc()
weist immer physischen Speicher, können Sie rufen Siemalloc()
immer wieder mit Größen, die sich nicht durch 1, sondern durch die aufeinander folgenden Potenzen von zwei. Das wird wirksamer sein. Unten ist ein Beispiel, wie es zu tun.Wenn auf der anderen Seite
malloc()
nur reserviert virtuellen Adressraum ohne Zuordnung physikalischer Speicher es dies nicht geben Ihnen, was Sie wollen.Beispielcode:
Ausgang (ideone):
malloc() nicht zulassen würde, dass du diese bytes sowieso.
InformationsquelleAutor Alexey Frunze
Suchte ich und fand diese Frage, um mir zu helfen einen Antrag zu animieren zahlreiche Iterationen der fraktalen Funktionen auf mehrere arrays aus komplexen Werten.
Danke, Alexey Frunse, für Ihre ideone.c-code. Es ist sicherlich hilfreich.
Gebäude auf das, was ich gelernt, in der Hoffnung, mehr Hilfsbereitschaft, ich habe das folgende geschrieben:
Verwendung:
Eingang:
Ausgabe:
Will ich re-Zweck, diese Funktionen in die eigene Anwendung.
InformationsquelleAutor Randall Sawyer