Visual C++: Stack around variable "x" was corrupted



  • wenn der Stack viel auslagern muss ist es nicht schneller wie aufm Heap!

    *lol*



  • nicht??? 😕
    Naja war ich der Meinung



  • Behebe den Fehler, danach sollte die Meldung nicht mehr kommen. 😎

    Bye, TGGC



  • Ich habe den Code ähnlich wie beschrieben geändert:

    char *empfangeZeile = new char[NETZPAKET_BUFFER_SIZE];
    .
    .
    .
    delete [] empfangeZeile;
    

    Beim Delete kommt nun allerdings ein anderes Debug-Warnfenster 😃

    Folgender Inhalt:
    "Damage after Normal block (#45) at 0x008C43D0"

    Diese Meldung ist leider noch unverständlicher als die Vorherige. Gibt es vielleicht in der MSDN wo diese Meldungen genauer erklärt werden?

    Wenn ich den Delete direkt nach der Speicheranforderung schreibe, funktioniert der Delete erwartungsgemäß:

    char *empfangeZeile = new char[NETZPAKET_BUFFER_SIZE];
    delete [] empfangeZeile;
    .
    .
    


  • Ok, Fehler ist eliminiert, die Variable wurde wären der Bearbeitung "korrumpiert"

    Ich benutzte folgenden Netzwerkcode

    rc=recv(clientSockets[i],empfangeZeile,NETZPAKET_BUFFER_SIZE,0);
    empfangeZeile[rc]='\0';
    

    Da rc die Länge der enthaltenen Zeichen angibt, wurde die Variable mittendrin mit \0 quasi abgeschlossen worauf der Delete[] nicht mehr die ganze Variable auf dem Heap löschen konnte.
    Stimmt dies so?



  • Da rc die Länge der enthaltenen Zeichen angibt, wurde die Variable mittendrin mit \0 quasi abgeschlossen worauf der Delete[] nicht mehr die ganze Variable auf dem Heap löschen konnte.

    Dieser Satz ist falsch.



  • lizardking schrieb:

    Ok, Fehler ist eliminiert, die Variable wurde wären der Bearbeitung "korrumpiert"

    Ich benutzte folgenden Netzwerkcode

    rc=recv(clientSockets[i],empfangeZeile,NETZPAKET_BUFFER_SIZE,0);
    empfangeZeile[rc]='\0';
    

    Da rc die Länge der enthaltenen Zeichen angibt, wurde die Variable mittendrin mit \0 quasi abgeschlossen worauf der Delete[] nicht mehr die ganze Variable auf dem Heap löschen konnte.
    Stimmt dies so?

    Ne. Der buffer ist um ein byte zu klein. mit

    empfangeZeile[rc]='\0';
    

    schreibst du auf empfangeZeile[NETZPAKET_BUFFER_SIZE] und dieser speicher gehört dir nicht mehr.
    Lösung:

    char empfangeZeile[NETZPAKET_BUFFER_SIZE + 1];
    

    Kurt



  • Vielen vielen Dank an alle hilfsbereiten Schreiber hier!

    Man lernt halt nie aus 🤡



  • ich glaub eher

    empfangeZeile[rc - 1]='\0';

    wäre richtig



    • 1 schrieb:

    ich glaub eher

    empfangeZeile[rc - 1]='\0';

    wäre richtig

    Dann hast du auch keinen Fehler mehr aber du überschreibst das letzte empfangene byte und du bekommst Problemen wenn nichts empfangen wird ( überschreibst empfangeZeile[- 1]. Das ist aber nicht im Sinne des Erfinders.
    Kurt



  • also ich hab das bis jetzt immer so gemacht und es hat funktioniert. werde ich nochmal genauer überprüfen...

    müsste doch eigentlich richtig sein. das array fängt ja bei 0 an. deswegen muss man eins abziehen von der länge.



  • lizardking schrieb:

    Da rc die Länge der enthaltenen Zeichen angibt, wurde die Variable mittendrin mit \0 quasi abgeschlossen worauf der Delete[] nicht mehr die ganze Variable auf dem Heap löschen konnte.
    Stimmt dies so?

    Wie ZuK schon sagte, ne. delete[] interessiert der Inhalt deines Arrays herzlich wenig, das will nur die Adresse des Speicherbereiches wissen, welcher irgendwann mal mit new[] reserviert wurde. Die Grösse des Arrays kennt delete[], bzw. der darunter liegende Speichermanager, schon selbst.



    • 1 schrieb:

    also ich hab das bis jetzt immer so gemacht und es hat funktioniert. werde ich nochmal genauer überprüfen...

    müsste doch eigentlich richtig sein. das array fängt ja bei 0 an. deswegen muss man eins abziehen von der länge.

    Das solltest du wirklich überprüfen. recv nimmt als parameter die grösse des buffers sagen wir buffer ist als char * buffer [255] deklariert. normalerweise übergibst du sizeof(buffer) also 255 an recv. receive gibt dir also maximal 255 zurück. wenn du dann auf buffer[255] schreibst schreibst du auf das 256. byte und das ist ausserhalb des buffers. schreibst du aber auf buffer[254] dann überschreibst du das letze empfangene byte.
    Kurt


Anmelden zum Antworten