Wahrscheinlich ist jeder während der Entwicklung mindestens einmal auf dieses Problem gestoßen:
%Vor%Wie Sie sehen, fängt das Programm an, den gesamten Systemspeicher zu leeren, Ihr Programm hängt und Ihr System fängt an, wie verrückt zu tauschen. Wenn Sie das Problem nicht schnell genug erkennen und den Prozess beenden, erhalten Sie wahrscheinlich innerhalb von Sekunden ein nicht reagierendes System, in dem sich Ihr Mauszeiger nicht einmal bewegt. Sie können entweder auf einen Programmabsturz mit dem Fehler "Nicht genügend Arbeitsspeicher" warten (was einige Minuten dauern kann) oder auf den Reset auf Ihrem Computer klicken.
Wenn du den Fehler nicht sofort aufspüren kannst, wirst du mehrere Tests und Resets benötigen, um herauszufinden, was sehr nervig ist ...
Ich suche nach einer möglicherweise plattformübergreifenden Möglichkeit, dies irgendwie zu verhindern. Am besten wäre ein Debug-Modus-Code, der das Programm beendet, wenn er zu viel Speicher zugewiesen hat, aber wie kann ich verfolgen, wie viel Speicher zugeordnet ist? Das Überschreiben der globalen Operatoren "new" und "delete" wird nicht helfen, da die freie Funktion, die ich beim Löschen aufrufen würde, keine Vorstellung davon geben würde, wie viele Bytes frei sind.
Irgendwelche Ideen geschätzt.
Das Überschreiben der globalen new- und delete-Operatoren wird nicht helfen, da die freie Funktion, die ich beim Löschen aufrufen würde, keine Vorstellung davon geben wird, wieviele Bytes frei sind.
Aber Sie können es so machen. Hier ist ein vollständiges Framework zum Überladen der globalen Speicheroperatoren (werfen Sie es in eine global_memory.cpp
-Datei):
Dann können Sie etwas tun wie:
%Vor%Wenn Sie ein Linux- oder Unix-ish-System verwenden, können Sie setrlimit (2) einchecken Damit können Sie Ressourcenlimits für Ihr Programm konfigurieren. Sie können ähnliche Dinge mit ulimit von der Shell aus tun.
weil die freie Funktion, die ich beim Löschen aufrufen würde, keine Vorstellung davon geben würde, wieviele Bytes frei sind
Es kann, Sie müssen nur eine Karte der Größe des zugewiesenen Speichers nach Adresse behalten, und subtrahieren Sie die richtige Menge auf der Grundlage dieser Informationen während der freien.
Wenn Sie einen einfachen Weg finden möchten, all diese potenziellen Lücken zu finden, verwenden Sie einfach Ihren Texteditor und suchen Sie in Ihrem gesamten Quelltext nach .push_back. Untersuchen Sie dann alle Vorkommen dieses Funktionsaufrufs und sehen Sie, ob sie sich in einer engen Schleife befinden. Das kann Ihnen helfen, einige schlechte Probleme im Code zu finden. Sicher, Sie können 100 Treffer bekommen, aber das kann in einer endlichen Menge an Zeit untersucht werden. Oder Sie könnten einen statischen Analysator schreiben (Using Scitools API), um alle while-Schleifen zu finden, die eine Container-Methode namens .push_back haben, die in ihnen aufgerufen wird.
Tags und Links memory-leaks c++ debugging memory-management