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 Stelle

    delete[] 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*


Anmelden zum Antworten