Wie kann man das "Tauschen des Todes" während der Entwicklung vermeiden?

8

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.

    
Calmarius 24.07.2010, 20:22
quelle

5 Antworten

10
  

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):

%Vor%

Dann können Sie etwas tun wie:

%Vor%     
GManNickG 24.07.2010, 20:35
quelle
13

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.

    
Steven Schlansker 24.07.2010 20:35
quelle
1
  

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.

    
Wim 24.07.2010 20:27
quelle
0

Sie könnten Ihren eigenen globalen neuen Operator implementieren:

%Vor%

Legen Sie dann einfach eine feste Grenze für die Menge des zugewiesenen Speichers fest; vielleicht sogar wie moch Kb / sek

    
Gianni 24.07.2010 20:28
quelle
0

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.

    
C Johnson 27.07.2010 03:40
quelle