std::bad_alloc Fehler wegen dynmaischer Felder mit Zeiger



  • Hallo,

    ich habe eine Aufgabe, in der man eine Finite Differenzen Iteration durchführen muss. Die Anzahl Werte, bzw. Zeilen des Datensatzes sollen vom Programm selbst ermittelt werden. Da ich C++ Anfänger bin habe ich die Verwendung von Zeigern wahrscheinlich falsch interpretiert. Ich wollte Felder der Form Array[1][nx] bilden, wobei nx vom Programm ermittelt wird. Ich habe daher z.B. im globalen Teil definiert:

    long double **ybr_out =0;
    

    Dann im main Teil, nachdem nx bekannt ist:

    ybr_out = new long double*[1];    ybr_out[1] = new long double[nx]; ybr_out[0]= new long double[nx];
    

    Ich habe sehr viele solcher Variablen. Wenn ich mir für die Iteration über c_out Ergebnisse für die ersten Iterationsvorgänge ansehen möchte, habe ich kein Problem. Wenn ich allerdings Daten in ein externes File übertragen möchte, bekomme ich die bad_alloc Fehler-Meldung. Dabei lautet mein Code:

    if(t_out==2e-9 | t_out==0.1e-3 | t_out==0.5e-3 | t_out==1e-3 | t_out==2e-3 | t_out==10e-3 | t_out==30e-3){
                    ofstream L("c:\\meingitter.txt",ios::out|ios::app);
                         for(int i = 0; i <= j; i++)
                        {cout << T_out [0][i]<<endl;
                         L << setprecision(15)<<i<<" "<<x_out[i]<<" "<<T_out[0][i]<<" "<<t_out<< endl;
                }L.close();
                }
    

    Dabei sind x_out, T_out genauso wie oben ybr_out deklariert und ich habe noch viele weitere Variablen im Code so deklariert. Ich denke, das war eine sehr dumme Idee und verbraucht zuviel Speicherplatz, aber das ganze umzubauen wäre sehr mühsam. Außerdem funktionieren die Berechnungen, wenn ich Ergebnisse nur mit cout aufrufe. Sieht jemand eine Lösung für das Problem? Könnte ich z.B. die Zeiger mit delete Löschen ohne das die Werte in den Feldern verloren gehen?



  • Cout funktioniert, aber dieselbe Ausgabe in eine Datei führt zu bad_alloc? Das halte ich für unwahrscheinlich. Wenn es allerdings tatsächlich so ist und du das Programm nicht mehr ändern willst, leite Ausgabe des Programms (also cout) auf der Kommandozeile in eine Datei um. Baust du eine 64 Bit Version? Vielleicht würde die ja das Problem umschiffen.

    Du kannst natürlich Speicher, den du mit delete freigegeben hast, nicht weiter verwenden.



  • numerikzeug schrieb:

    ybr_out = new long double*[1];    ybr_out[1] = new long double[nx]; ybr_out[0]= new long double[nx];
    

    Das passt irgendwie nicht. Du musst entweder Platz für 2 Pointer reservieren oder nur auf ybr_out[0] zugreifen.



  • "numerikzeug schrieb:
    C++:
    ybr_out = new long double*[1]; ybr_out[1] = new long double[nx]; ybr_out[0]= new long double[nx];

    Das passt irgendwie nicht. Du musst entweder Platz für 2 Pointer reservieren oder nur auf ybr_out[0] zugreifen."

    Da ich im globalen Teil long double **ybr_out =0 gesetzt habe, habe ich doch zwei Pointer reserviert.

    Was mich wundert ist, dass ich die bad::alloc Meldung nur bekomme, wenn sobald ich den ofstream Befehl verwende, selbst wenn ich den komplett leer lasse, bzw. keine Variablen exportieren lasse.

    "leite Ausgabe des Programms (also cout) auf der Kommandozeile in eine Datei um"
    Kannst Du mir den Code dazu geben, bzw. sagen, welchen Befehl ich verwenden muss?



  • mein_programm > meine_datei
    


  • numerikzeug schrieb:

    Da ich im globalen Teil long double **ybr_out =0 gesetzt habe, habe ich doch zwei Pointer reserviert.

    Nein. Dadurch, dass du long double **ybr_out =0 setzt hast du lediglich deinen Pointer auf 0 gesetzt und noch gar nichts reserviert. Wenn du dann das erste ybr_out = new long double*[1] schreibst hast du dir Platz für einen Pointer auf long double reserviert, nicht zwei.

    numerikzeug schrieb:

    Was mich wundert ist, dass ich die bad::alloc Meldung nur bekomme, wenn sobald ich den ofstream Befehl verwende, selbst wenn ich den komplett leer lasse, bzw. keine Variablen exportieren lasse.

    Nur weil dein Programm mit der Ausgabe per cout das erwartete Verhalten zeigt, heißt es nicht, dass dein Programm fehlerfrei ist. Vermutlich zerschießt du dir irgendwas auf dem Stack oder Heap durch die Zugriffe auf nicht existierende Arrayelemente.



  • Müsste dies dann konkret z.B. so ausserhen:

    [code]
    cout << ybr_out[0][i] >> (C:\\outputfile.txt)



  • Der Code von manni66 ist kein C++ Code. Das ist was man in der Konsole eingeben muss. Dein Programm bleibt unverändert und du statt das Programm nur mit mein_programm zu starten schreibst du mein_programm > meine_datei .


Log in to reply