Speicherverwaltung: Problem bei Speicherreservierung („new []“)

busenbach

Mitglied
Hallo,
ich habe ein komisches Problem mit „Speicherverwaltung“, womit ich mich überhaupt nicht auskenne und einfach nicht klar komme.

Ich schreibe ein Impuls-Analyse-Programm und verwende viele große Daten (z.B. Arrays mit hunderttausend oder gar Millionen Speicherblöcke). Ein Fehler was tendenziell oft passiert ist, dass ich mich verrechne und die Arrays überschritten werden. Spätestens bei der Speicherfreigabe („delete []“) meckert c++, dass es ein Problem gibt und ich weiß immer sofort wo der Fehler ist.
Ansonsten klappt alles wunderbar, ich erstelle mir die Arrays („new []“) und gebe diese am Ende wieder frei („delete“).



Aktuelles Problem:
Seit neustem meckert C++ schon bei der Speichererstellung! Je nachdem wie viele Daten ich einlese bleibt das Programm bei irgendeiner Speicherreservierung für eine Variable hängen und gibt folgende Fehlermeldungen bei folgendem Code:

----Code----
Jitter_fe = new double[fe_range]; //fe_range = (int) 560
Jitter_re = new double[re_range]; //fe_range = (int) 561
----Code----

-->Fehlermeldung 1
Debug Error
Program: d:\Visual C++ Express\Wave\debug\Wave.exe
Invalid allocation size: 4294967295 bytes


-->Fehlermeldung 2
Unhandled exception at 0x7c812a5b in Wave.exe: Microsoft C++ exception: std::bad_alloc at memory location 0x0012f870..

Kann sich das jemand erklären? Ich würde verstehen, dass beim Löschen ein Fehler entsteht weil der Speicher schon übergelaufen ist, aber wieso kann ich nicht mal Speicher reservieren noch bevor ich das was rein geschrieben habe? Und so viele Daten sind das nun auch wieder nicht, (diese Fehlermeldung entstand bei 100.000 Einlesedaten, ich habe es schon mal mit 10Mio Daten geschafft).



Sicher kann ich nicht verlangen den Fehler zu finden, kann ja nicht meinen ganzen Source-Code reinkopieren, aber es geht mir um die Theorie, habe absolut keine Erfahrung in der Thematik. Vielleicht hatte ja jemand schon mal ein ähnliches Problem.

Danke im Voraus!
 
Hi.
Ansonsten klappt alles wunderbar, ich erstelle mir die Arrays („new []“) und gebe diese am Ende wieder frei („delete“).
Du meinst delete[] oder?
Kann sich das jemand erklären? Ich würde verstehen, dass beim Löschen ein Fehler entsteht weil der Speicher schon übergelaufen ist, aber wieso kann ich nicht mal Speicher reservieren noch bevor ich das was rein geschrieben habe?
Der Speicher muss für das Array alloziert werden ob du da nun etwas reinschreibst oder nicht. Und zwar muss für ein Array ein zusammenhängender Block der entsprechenden Größe bereitgestellt werden. Ist ein solcher Block nicht frei, schlägt die Allokation fehl.

Gruß
 
Hi.Du meinst delete[] oder?

Der Speicher muss für das Array alloziert werden ob du da nun etwas reinschreibst oder nicht. Und zwar muss für ein Array ein zusammenhängender Block der entsprechenden Größe bereitgestellt werden. Ist ein solcher Block nicht frei, schlägt die Allokation fehl.

Gruß

1) ja genau! meine "delete[]"

2) aber ich meine so viele Daten waren das nun auch wieder nicht. Waren ja nur "läppische" 100.000 Einlesepunkte und ich habe es schon mit "deutlich" mehr grmacht. Ausserdem dachte ich, das Windows 4GB Speicher insgesammt für Programme zur Verfügung stellt (wobei 2GB schon das Betriebssystem selbst braucht) und da sollte sich doch wohl genug zusammenhängender freier Speicher finden, oder?
 
Hi.
2) aber ich meine so viele Daten waren das nun auch wieder nicht. Waren ja nur "läppische" 100.000 Einlesepunkte
Ja, waren ja nur läppische "4294967295 bytes" == 4GB. Windows (32bit) kann zwar 4GB addressieren, aber allein 4GB für ein Array anzulegen ist nicht möglich. Scheint deine Jitter Objekte sind etwas gross (42KiB)?

Gruß
 
Hi.
Ja, waren ja nur läppische "4294967295 bytes" == 4GB. Windows (32bit) kann zwar 4GB addressieren, aber allein 4GB für ein Array anzulegen ist nicht möglich. Scheint deine Jitter Objekte sind etwas gross (42KiB)?

Gruß

ach Gott, du hast ja recht, das sind ja schon die 4GB! jetzt habe ich überall nach dem Fehler gesucht, dass ich das total übersehen habe :rolleyes:

Also die Jitter Arrays waren hier jeweils 2xmal 560 groß (alles "double"-Werte). Aber das kann nicht das Problem sein, ich denke mal ich habe den Speicher vorher schon gecrasht mit irgendwas anderem. Das wundert mich aber jetzt sehr, wie ich den Speicher so schnell voll kriege.... eigentlich ist da nichts größeres mehr.
danke!
 
Zuletzt bearbeitet:
Zurück