Speicherproblem bei dynamischem Array
-
Hi!
Ich habe eine Klasse mit einem array, das je nach Bedarf erweitert wird. Bei den ersten 2-3 Erweiterungen funktioniert das tadelos, dann bekomme ich eine exception, aber an einer ganz anderen Stelle, ich vermute, dass Speicher überschrieben wird. Wer weiss wo ich welchen Fehler gemacht habe?
#define STRING_SIZE 5 class CToken { private: char *String; //Token-String int TokLength; //maximale Länge des Token-Strings public: void Write2(char chr); ....... ..... ... . }; inline void CToken::Write2(char chr) { this->String[this->Length++] = chr; if (this->Length == this->TokLength) { //array erweitern char *tmp = new char[this->TokLength * 2]; //kopieren des vorhandenen arrays in's neue memcpy(tmp, this->String, this->TokLength); this->TokLength *= 2; delete this->String; this->String = tmp; } } CToken::CToken() { //init Token-Buffer this->TokLength = STRING_SIZE; //Lexem-String erstellen this->String = new char[this->TokLength]; this->Length = 0; }
Danke im voraus!
Sebo
-
Vielleicht das?:
delete this->String;
zu
delete[] this->String;
Ansonsten schick mal wo die Fehlermeldung kommt und was diese sagt.
Code-Hacker
-
Wie gesagt, der Fehler passiert ganz wo anders und zwar ist in einer Funktion auf einmal der this Zeiger nicht mehr vorhanden?!? Aber danke für den Tip, ich probiers mal aus!
Sebo
-
Hi!
Nee, der Tip war nicht ausreichend. Hab' folgende Fehlermeldung:
**
---------------------------
Microsoft Visual C++ Debug Library
---------------------------
Debug Error!Program: ...ester\Systemprogrammieren\Aufgabe 1\scanner\Debug\scanner.exe
DAMAGE: after Normal block (#51) at 0x00431810.
(Press Retry to debug the application)
---------------------------
Abbrechen Wiederholen Ignorieren
---------------------------
**
Die Fehlermeldung kommt diesmal beim dritten erweitern und zwar an der Stelledelete[] this->String;
Wenn ich
delete[] this->String;
auskommentiere, dann bekomme ich folgende Fehlermeldung an einer anderen Stelle.
**
---------------------------
Microsoft Visual C++
---------------------------
Unbehandelte Ausnahme in scanner.exe: 0xC0000005: Access Violation.
---------------------------
OK
---------------------------
**
Die Stelle ist:sprintf(chr, "Token %13s Line: %6d Column: %4d Lexem: %s\n", this->StrTokenType[TokType], this->Row, this->Col, this->String);
die Funktion wird noch richtig abgearbeitet, dann ist aber der this Zeiger von 0x0012fdb8 auf eine die Adresse 0x0a65646e gesprungen!! Wie das denn?! *mpf*
-
hat chr vielleicht nicht genug speicher?
-
Oh Kacke! Ja, des Ding hat zu wenig Speicher! Jetzt treten auch keine Probleme mehr auf! Hätte ich selber drauf kommen können! *mpf*