'new' und 'delete[]' - Newbie Frage



  • Einfache Frage zu delete[]

    Ist es legal einen Zeiger zu verschieben, der auf einen mit 'new' Angelegten Speicher zeigt?
    Wie verhalt sich delete[] nachdem man den Zeiger verschoben hat?
    Hier ein Beispiel:

    #include <iostream>
    
    using namespace std;
    
    const int SIZE = 16;
    
    int main()
    {
    
      char * pbuffer = new char[SIZE];
      for (int i=0;i<SIZE;i++) pbuffer[i]=65+i;  
      pbuffer[SIZE-1]=0;
    
      cout << pbuffer << endl;   // ABCDEFGHIJKLMNO
      pbuffer += 10;
      cout << pbuffer << endl;   // KLMNO
    
      delete[] pbuffer;          // Was wird hier deleted? Ursprungliche 16 bytes?
                                 // oder memory leak? 
    
      system ("PAUSE");
      return 0;
    }
    

    Entschulding meine Anfangerproblem. Ist der oben genannte code als 'bad practice' zu beurteilen, oder duchaus zulassig?



  • http://cpp-tutor.de/cpp/le11/le11_01.htm#delete

    //edit: bevor wieder kommt: Was soll ich da finden ? bin ja kein anfänger, etc. pp:

    delete gibt nur den Speicher frei, verändert aber den Inhalt des Zeigers nicht, d.h. er enthält weiterhin die alte Adresse. Sie dürfen aber nach der Ausführung von delete keine weiteren Zugriffe mehr über diesen Zeiger auf den freigegebenen Speicherbereich durchführen.



  • char * pbuffer = new char[16];
    
     char * test = pbuffer;
    
     pbuffer += 10;
    
     delete[] pbuffer;          // Was wird hier deleted? Ursprungliche 16 bytes?
    

    Darf ich jetzt auch

    for (int i=0; i< 6; i++) 
          test[i]=0;
    

    schreiben oder nicht?



  • sorry fur's Doppeltposten...

    Erst mals, vielen Dank fur deine Antwort. Ich versuche mal meine Frage in anderen Worten zu ausern.

    Ist est moglich mit delete[] nur einen Teil des allokierten Speicherplaztzes freizugeben? Habe danach in FAQs + Tutorials gesucht, aber nichts gefunden.

    Danke.



  • delete gibt immer komplett frei



  • maciej64 schrieb:

    Ist es legal einen Zeiger zu verschieben, der auf einen mit 'new' Angelegten Speicher zeigt?
    Wie verhalt sich delete[] nachdem man den Zeiger verschoben hat?

    1. Ja, natürlich.
    2. Undefiniertes Verhalten. delete darf nur auf Pointer aufgerufen werden, die zuvor von new zurückgegeben wurden. Wenn du den Pointer veränderst, ist das nicht mehr der Fall. In der Praxis sieht das so aus, dass delete nach der Steuerinformation für den übergebenen Speicherblock sucht (da steht z.B. die Größe drin, ob der Block frei oder belegt ist, wo der vorhergehende und der nachfolgende Block steht, oder sowas in der Art). Es wird dann die an der übergebenen Stelle stehenden Sinnlos-Werte trotzdem irgendwie interpretieren und eine Weile wilden Pointern hinterherrennen, in der Hoffnung einen imaginären Heap unter Kontrolle zu bekommen. Der Absturz folgt auf dem Fuße.

    Entschulding meine Anfangerproblem. Ist der oben genannte code als 'bad practice' zu beurteilen, oder duchaus zulassig?

    Hast du ihn denn mal ausprobiert? 🙄



  • @Bashar

    Vielen Dank fur Deine ausfurliche, wertvolle Antwort!

    Bashar schrieb:

    Hast du ihn denn mal ausprobiert? 🙄

    Peinlicherwise uberall in meinem 500-Zeilen code. Sonderbar ist jedoch, dass mein Programm einwandfrei zu funktionieren schien.



  • Darauf kannst du dich aber nicht verlassen! Das delete[] wird in der Praxis wahrscheinlich dein Objekt schon freigeben, vielleicht aber noch mehr. Und irgendwann, wenn der Mond wieder zunehmend ist und in China ein Sack Reis umfällt, kackt dein Programm dann ab.
    Nicht zuletzt, selbst wenn du die Implementierung deines Compilers kennst und sicher sein kannst, das alles passt, kannst du deinen Source nicht mehr ohne weiteres woanders compilieren. Und gewinnen tust du ja dadurch auch nichts.



  • *hierstandmüll* :xmas1:


Anmelden zum Antworten