Visual C++: Stack around variable "x" was corrupted
-
probier mal vom Stack auf den Heap zu gehen, mach dazu
const static int NETZPAKET_BUFFER_SIZE = 1500; char empfangeZeile = new char[NETZPAKET_BUFFER_SIZE];
hier aber das deleten nicht vergessen. Wie ich mir hab sagen lassen alles was man mit new anlegt muss man auch deleten (grüße an Estartu
)
-
Polofreak: Und warum? Wegen 1500 Bytes braucht man nicht den Heap zu nehmen.
-
hm wer weiß was er davor alles auf den Stack geworfen hat! wenn der Stack viel auslagern muss ist es nicht schneller wie aufm Heap! Und wenn er nen Fehler bekommt ist es doch zumindest mal ein Versuch wert. Was bietest du denn als zielführenden Vorschlag an?
-
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