Arbeitsspeicher läuft voll durch Arrays
-
Ähm, Code zeigen? Wahrscheinlich übersiehst du den Fehler.
Scheisse, meine Bratkartoffeln
-
hage2001 schrieb:
Aber genauso habe ich es doch gemacht, oder etwa nicht?
Dafuer hast du wohl zu wenig Code gepostet, um das zu beurteilen. Hast du denn mal gezaehlt, wieviel new's und delete's du hast? Es zaehlen die Aufrufe!
-
hier mal der ganze code, die funktionsaufrufe habe ich rausgenommen, da die sehr groß sind.
const int koordinaten_anzahl = 9; // Für die Größe der Arrays - Einlesen aus FMS const int koordinaten_kurve_anzahl = (((koordinaten_anzahl-2) * 10) + 2); double *arr_lat, *arr_long, *arr_alt, *arr_speed, *arr_curve_lat, *arr_curve_long, *arr_curve_alt, *arr_curve_90_lat, *arr_curve_90_long, *arr_curve_90_alt, *arr_curve_270_lat, *arr_curve_270_long, *arr_curve_270_alt; double *arr_local_x, *arr_local_y, *arr_local_z, *arr_local_90_x, *arr_local_90_y, *arr_local_90_z, *arr_local_270_x, *arr_local_270_y, *arr_local_270_z; int DrawFunktion() { arr_lat = new double [koordinaten_anzahl]; arr_long = new double [koordinaten_anzahl]; arr_alt = new double [koordinaten_anzahl]; arr_speed = new double [koordinaten_anzahl]; // Konstante Daten arr_lat[0] = 47.261094444444446; arr_long[0] = 11.352863888888889; arr_alt[0] = 582; arr_speed[0] = 50; //... befüllen des Arrays nach diesem Muster // Aufruf der Kurvenberechnung arr_curve_lat = new double [koordinaten_kurve_anzahl]; arr_curve_long = new double [koordinaten_kurve_anzahl]; arr_curve_alt = new double [koordinaten_kurve_anzahl]; for(int ix = 0, iy = 0; ix != koordinaten_anzahl-2; ++ix, iy=iy+10) { Kurvenflug(); } // Erzeugen der Begrenzungspunkte für die Checkpoints arr_curve_90_lat = new double [koordinaten_kurve_anzahl]; arr_curve_90_long = new double [koordinaten_kurve_anzahl]; arr_curve_90_alt = new double [koordinaten_kurve_anzahl]; arr_curve_270_lat = new double [koordinaten_kurve_anzahl]; arr_curve_270_long = new double [koordinaten_kurve_anzahl]; arr_curve_270_alt = new double [koordinaten_kurve_anzahl]; int iy; for(int ix = 0; ix != koordinaten_kurve_anzahl-1; ++ix) { Begrenzung(); } // Umrechnung in X Plane Lokale Koordinaten (für alle Koordinaten) arr_local_x = new double [koordinaten_kurve_anzahl]; arr_local_y = new double [koordinaten_kurve_anzahl]; arr_local_z = new double [koordinaten_kurve_anzahl]; arr_local_90_x = new double [koordinaten_kurve_anzahl]; arr_local_90_y = new double [koordinaten_kurve_anzahl]; arr_local_90_z = new double [koordinaten_kurve_anzahl]; arr_local_270_x = new double [koordinaten_kurve_anzahl]; arr_local_270_y = new double [koordinaten_kurve_anzahl]; arr_local_270_z = new double [koordinaten_kurve_anzahl]; for(int ix = 0; ix != koordinaten_kurve_anzahl; ++ix) { Umrechung(); } // Aufruf der Zeichnungsfunktion for(int ix = 0; ix != koordinaten_kurve_anzahl-1; ++ix) { Checkpoint(); } // Speicher freigeben delete[] arr_lat; delete[] arr_long; delete[] arr_alt; delete[] arr_speed; delete[] arr_curve_lat; delete[] arr_curve_long; delete[] arr_curve_alt; delete[] arr_curve_90_lat; delete[] arr_curve_90_long; delete[] arr_curve_90_alt; delete[] arr_curve_270_lat; delete[] arr_curve_270_long; delete[] arr_curve_270_alt; delete[] arr_local_x; delete[] arr_local_y; delete[] arr_local_z; delete[] arr_local_90_x; delete[] arr_local_90_y; delete[] arr_local_90_z; delete[] arr_local_270_x; delete[] arr_local_270_y; delete[] arr_local_270_z; return 0; }
Ich hoffe das bringt uns weiter. Vielen Dank für eure Mithilfe schonmal.
-
hage2001 schrieb:
hier mal der ganze code, die funktionsaufrufe habe ich rausgenommen, da die sehr groß sind...
Bei deinem Code sträuben sich mir die Nackenhaare.
1. Warum globale Variablen (Besser lokal mit Übergabeparametern an die Funktionen).
2. Werte die zusammen gehören würde ich auch zusammenfassen. Sei es in eine einfache Struktur (im Sinne POD), oder falls Logik dazugehört in eine Klasse (im Sinne von Nicht-POD).
2a) Wenn du diesen dann auch noch einen Konstruktor spendierst wird die Zuweisung wohl auch deutlich kürzer.
3. Lange Funktionen neigen dazu unübersichtlich und unleserlich zu werden, ggf. solltest du die Funktion noch untergliedern (oder auf anderen Weg wie z.B. unter 2 angesprochen den Code reduzieren).
-
hage2001 schrieb:
hier mal der ganze code, die funktionsaufrufe habe ich rausgenommen, da die sehr groß sind.
Hier hast Du zu jedem new[] ein passendes delete[]. An dieser Funktion liegt's nicht.
-
An diesem Code liegt es wohl nicht.
-
double *arr_lat, *arr_long, *arr_alt, *arr_speed, *arr_curve_lat, *arr_curve_long, *arr_curve_alt, *arr_curve_90_lat, *arr_curve_90_long, *arr_curve_90_alt, *arr_curve_270_lat, *arr_curve_270_long, *arr_curve_270_alt; double *arr_local_x, *arr_local_y, *arr_local_z, *arr_local_90_x, *arr_local_90_y, *arr_local_90_z, *arr_local_270_x, *arr_local_270_y, *arr_local_270_z;
die können auch in der funktion (DrawFunction) stehen, ich hatte sie gerade nur rauskopiert. gibt es noch eine andere möglichkeit rauszufinden, wo der speicher vollläuft?
die unterfunktionen sind es auch nicht, die habe ich schon einzeln auskommentiert und getestet. nur wenn ich die ganze DrawFunction rausnehme läuft der Speicher nicht voll.
-
valgring kann das, gibt es aber nur fuer Linux. Auch wird wohl sowas bei Visual Studio mitgeliefert sein.
-
also für linux das tool habe ich gefunden, aber bei ms visual studio 2008 (das nutze ich) habe ich nicht finden können, vielleicht hab ichs aber auch einfach nur nicht erkannt...jemand ne idee?
-
Kommentier halt noch nacheinander die DrawFunction() aus...
-
hage2001 schrieb:
@theta: wenn ich mit std::vector<double> arbeite, dann kann ich doch immer nur auf den obersten Wert greifen, oder?
Nein. Der std::vector hat einen index Operator und garantiert, dass der Speicherbereich zusammenhängen ist, falls das nötig sein sollte.
Simon
-
3.43597e+009 schrieb:
Kommentier halt noch nacheinander die DrawFunction() aus...
Ich habe bereits die einzelnen Unterfunktionen auskommentiert und das hat keinen Unterschied gemacht. Nur wenn ich die ganze Funktion DrawFunction() auskommentiere wird kein Speicher genutzt, allerdings macht das Programm dann auch gar nicht;)
-
Tja, so blöd es klingt, dann kommentiere alle new/delete Aufrufe in DrawFunction() aus und teste.
Wenn es dann kein Speicherleck gibt ist dein Computer kaputtoder du irrst dich einfach.
-
das problem ist, dass ich dann ja aber gar nicht arbeiten kann, weil ich ja auf die daten aus den arrays angewiesen bin.
-
Statt dass du jetzt noch viel Zeit darin investierst, dieses Gefrickel zu reparieren, solltest du lieber über ein Neu-Implementieren nachdenken. Du kannst mir glauben, sonst dauert es bestimmt nicht lange, bis du wieder ein ähnliches Problem hast. Auf Dauer wird das echt ermüdend.
Also nimm dir die Zeit und schreibe dir Klassen für Dinge, die zusammengehören. Teile auch deine Funktionen soweit auf, dass jede Funktion eine bestimmte Aufgabe hat. Indem du die Eigenschaften in eine Klasse packst, brauchst du auch die meisten Arrays nicht mehr, wodurch schon sehr viele Fehler eingeschränkt werden. Dann verleihst du der Klasse noch eine gewisse Kapselung (z.B. Getter und Setter), eventuell Assertions, und hast die Fehleranfälligkeit erneut auf einen Bruchteil reduziert. Wenn du jetzt noch STL-Container einsetzt, kannst du nicht mehr viel falsch machen.
Ich kann mir gut vorstellen, dass das für dich momentan nicht wirklich eine Option darstellt, wahrscheinlich fehlen dir bei gewissen Vorgehensweisen auch noch die Kenntnisse. Vielleicht machst du das auch erst beim nächsten Mal. Aber ich kann dir wirklich nur raten, dein Problem in mehrere kleine Probleme aufzuteilen und die Wartbarkeit somit massiv zu erhöhen. Sonst treiben dich solche Dinge noch in den Wahnsinn, besonders wenns ums Debuggen und Fehlerfinden geht.
-
Sag mal, woher weißt du eigentlich, dass das Programm immer mehr Speicher verbraucht? Beziehungsweise bist du dir sicher, dass das nicht irgend wann von allein aufhört? Vielleicht arbeiten nur new() und delete() anders, als du es erwartest?
Stefan.
-
hallo zusammen, ich habe das problem gelöst. es lang an einer extern eingebunden funktion, die ich falsch genutzt hatte. jetzt passt es mit new[] und delete[]
Sag mal, woher weißt du eigentlich, dass das Programm immer mehr Speicher verbraucht?
das habe ich mit dem task manager von windows gesehen...
-