Programmabsturz bei Speicherreservierung



  • Hallo ihr C++ Lemminge,

    seit ein paar Stunden beschäftigt mich ein Problem und zwar ehrlich gesagt das seltsamste, das ich jemals hatte. Die meiste Zeit, hab ich es versucht, einzugrenzen, allerdings selbst das nur mit mäßigem Erfolg. Ich schreib einfach mal alles, was ich rausgefunden habe:

    Alles dreht sich um folgenden extrem simplen Codeschnipsel:

    double *x = new double[500];
    

    Setze ich diese Zeile an irgendeine Stelle in meinem Code, stürzt das Programm ab und zwar nicht in der Zeile, in der der Code steht sondern irgendwann später, allerdings immer bei einer weiteren Speicherreservierung.

    Die einzige Stelle, an der der Code das Programm nicht zum Absturz bringt, ist direkt am Anfang der main(). Gibt es jedoch vor dieser Codezeile schon eine andere Speicherreservierung, stürzt es wieder ab.

    Bisher könnte es ja daran liegen, dass der Speicher nicht ausreicht, aber:

    ändere ich die Länge des Arrays auf zB. 2000 oder mehr, läuft alles problemlos. 20000: kein Problem, 1000000: kein Problem. Es stürzt nur ab bei Werten von etwa 300 bis 1000 (der exakte Wert hängt davon ab, an welcher Stelle im Programm es steht). Unter 300 ist auch wieder kein Problem.

    Ändere ich den Variablennamen: weiterhin Abstürze
    Ändere ich den Variablentyp auf int (4 byte): Absturz bei Verdopplung des kritischen Intervalls (also von ~ 600 bis 2000), das gleiche für float (4 byte)

    Zusammenfassend:
    Reserviere ich mit "new" Speicher im Bereich von ~ 2400 bis 8000 byte, stürzt das Programm zu einem späteren Zeitpunkt bei einer anderen Speicherreservierung ab. Weniger Speicher = kein Problem, mehr Speicher = kein Problem.

    Kommentiere ich die Stelle, an der es später abstürzt aus, stürzt es bei der nächstmöglichen Speicherreservierung ab. Gibt es keine mehr danach, terminiert das Programm ganz normal.

    Jeder, dem ich das Problem bisher geschildert hab, zuckt verständlicherweise nur ahnungslos mit den Schultern. Vielleicht hab ich hier ja mehr Glück 😃

    Danke für jede Hilfe
    Godemit


  • Mod

    Da würde ich doch einmal stark annehmen, dass du irgendwo in Bereiche reinschreibst die dir nicht gehören. Das erzeugt undefiniertes Verhalten und führt dann zu solche merkwürdigen Sachen wie du sie beobachtest.

    Da ein double *x = new double[500]; aber allgemein sehr ungewöhnlich klingt: Hast du irgendeinen Grund, nicht std::vector zu benutzen? Sowohl hier als auch bei deinen anderen Speichereservierungen.



  • Naja, und wie soll ich verhindern, dass "new" mir plötzlich "verbotenen" Speicher allokiert? Und vorallem warum nur bei einer bestimmten Größe? Ich dachte bis heute, dass da schon sinnvoller Speicher ausgesucht wird 😃

    warum ich std::vector nicht benutze? hmm. Ich hatte es teilweise schon benutzt aber fand es nicht so komfortabel. Ich denke auch mal, dass es nicht so schnell ist wie ein simples array.

    Aber daran sollte es doch nicht liegen. Ich bin ja nicht der einzige, der arrays benutzt 😉


  • Mod

    Godemit schrieb:

    Naja, und wie soll ich verhindern, dass "new" mir plötzlich "verbotenen" Speicher allokiert? Ich dachte bis heute, dass da schon sinnvoller Speicher ausgesucht wird 😃

    Ich behaupte nicht, dass new etwas falsch macht, sondern dass du etwas falsch machst.

    warum ich std::vector nicht benutze? hmm. Ich hatte es teilweise schon benutzt aber fand es nicht so komfortabel.

    Deine Sache. Aber absolut unverständlich wie man manuelle Speicherverwaltung vorziehen kann.

    Ich denke auch mal, dass es nicht so schnell ist wie ein simples array.

    Blödsinn. vector macht genau das gleiche wie du. Aber im Zweifelsfall besser, weil die Programmierer von vector mehr Ahnung und vor allem Zeit haben.

    Aber daran sollte es doch nicht liegen.

    Oh, doch.

    Ich bin ja nicht der einzige, der arrays benutzt 😉

    Ohne Grund manuelle Speicherverwaltung? Da bist du einer der ganz wenigen. Das machen nur ahnungslose Anfänger. Und die machen es dann (wie du) sehr oft falsch. Oder C Programmierer, weil die keine Wahl haben.



  • Godemit schrieb:

    ch hatte es teilweise schon benutzt aber fand es nicht so komfortabel.

    Weil? Statt new deklarierst du einfach den vector, statt delete lässt du ihn einfach stillschweigend aus dem Scope fallen. Sonst ist das alles ziemlich gleich...

    Ich denke auch mal, dass es nicht so schnell ist wie ein simples array.

    Merke dir eines: wenn es um Schnelligkeit von Code geht, sollte man in Fällen wie diesem nicht denken sondern messen. Und das auch nur wenn die Schelligkeit wirklich der kritische Punkt ist.


Anmelden zum Antworten