Laufzeitfehler bei dynamischen Speicher



  • Hallo,

    ich habe mit folgender Methode einer Klasse Probleme:

    [cpp]bool Puffer::loeschen(int stelle)
    {
    if(stelle>=1 && stelle<=aklaenge) // Überprüfung der Existenz der zu löschenden Stelle
    {
    char* temp=new char[aklaenge-1]; // Temporärer Zwischenspeicher für den Puffer

    for(int i=0;i<stelle;i++)
    temp[i]=puffer[i];
    for(i=stelle+1;i<=aklaenge;i++)
    temp[i]=puffer[i];

    delete[] puffer;
    aklaenge--;
    puffer=new char[aklaenge]; // Puffer um eins verkürzen

    for (i=0;i<aklaenge;i++)
    puffer[i]=temp[i];

    delete[] temp;

    return true;
    }
    else
    return false;
    }[/cpp]

    Wenn ich das delete[] temp; weglasse,funktioniert die Methode einwandfrei,lasse ich es aber stehen,dann kommt immer ein Laufzeitfehler beim Aufruf der Methode!

    Hat jemand einen Ahnung woran das liegen könnte?

    Danke für eure Mühe

    Tobias



  • Probier doch mal folgendes:

    vector<char> puffer;
    
    bool loeschen( int stelle )
    {
        // Überprüfung der Existenz der zu löschenden Stelle
        if( (stelle > 0) && (stelle <= puffer.size()) ) {
            puffer.erase( puffer.begin()+stelle, puffer.end() );
            return true;
        } else {
            return false;
        }
    }
    
    int main()
    {
        puffer.assign( 10, '0' );
        for( char i='0'; i<='9'; i++ ) {
            puffer[i] = i;
        }
    
        loeschen( 7 );
    
        return 0;
    }
    

    Das sollte um einiges schneller sein als deine Methode und ist zudem noch "sicher".

    Viele Grüße
    Bastian



  • Vielen Dank erstmal Gerard für die "optische" Hilfe.

    Auch dir schern danke für deine Hilfe,ich werde das ausprobieren,
    kann mir vielleicht trotzdem noch jemand sagen,wo in meiner Methode der Fehler liegt?



  • Hier ist die Fehlermeldung,die er ausgibt:

    "DAMAGE: after Normal block (#65) at 0x008C1EE0"

    Beim Anklicken von Wiederholen erscheint dann folg. Fehlermeldung:

    "Die Ausnahme "unknown software exception" (0x80000003) ist in der Anwendung an
    der Stelle 0x00423eaf aufgetreten."

    Kann damit jemand etwas anfangen?



  • Du holst nicht genug Speicher für temp bzw. du schreibst zwei Bytes über das Ende des geholten Speichers hinaus.



  • Meinst du hier:

    for(i=stelle+1;i<=aklaenge;i++) 
              temp[i]=puffer[i];
    

    Selbst wenn ich das in der for-Schleife in ein < ändere,kommt die gleiche
    Fehlermeldung.
    Oder meinst du eine andere Stelle?



  • TobiasG82 schrieb:

    Selbst wenn ich das in der for-Schleife in ein < ändere,kommt die gleiche
    Fehlermeldung.

    Logisch. Denn dann schreibst immer noch ein Byte über das Ende hinaus.

    Du allokierst aklaenge-1 chars für temp.
    Also kannst du von temp[0] bis temp[aklaenge-2] darauf zugreifen.



  • Vielen Dank das du das Brett vorm Kopf weggenommen hast!!!!
    Man,mit dem Zählen ist das so eine Sache!!!



  • TobiasG82 schrieb:

    Vielen Dank das du das Brett vorm Kopf weggenommen hast!!!!
    Man,mit dem Zählen ist das so eine Sache!!!

    Warum? Man zaehlt einfach von 0 bis Laenge - 1.

    Is doch nicht so schwer 😃

    mfg
    v R


Anmelden zum Antworten