Newbie: Speicher freigeben mit delete



  • int main(int argc, char *argv[])
    {
      int* arr;
      arr = new int;
      arr[0] = 1;
      arr[1] = 2;
      arr[2] = 1;
      delete[] arr;
      arr[0] = 3;
      return 0;
    }
    

    Wieso ergibt dass keinen Speicherzugriffsfehler? Da ich doch mit delete den Speicher der Variable arr freigebe müsste doch mit dem letzten Aufruf von arr ein Fehler auftreten? 😕



  • zufall, dein programm wird noch crashen
    c++ testen nicht die gültigkeit und nimmts so hin



  • Hallo

    Speicher freigeben heißt nicht Speicher löschen. Sondern der Speicherbereich wird nur als verfügbar markiert. Nachfolgende Zugriffe darauf ergeben noch die selben Binärwerte. Erst der nächste echte Schreibzugriff durch ein neue Instanz überschreibt auch die Binärwerte im Speicher.
    Nichtsdestotrotz erzeugt das gezeigte Beispiel ungültiges Verhalten.

    bis bald
    akari



  • Ach so, danke für die schnelle Antwort! 👍

    Hab's kapiert auch wenn ich mir das Verhalten nicht gerade sehr sinnvoll erscheint. 😞



  • Es muß doch "delete" heißen und nicht "delete []" weil kein Array aus Integern angelegt wurde? Die Zugriffe "arr[1] = 2;" und "arr[2] = 1;" waren auch schon falsch.



  • Hallo

    Du siehst das Problem aus deiner Warte. Ein C++ Compiler kann den Verlauf und die Gültigkeit des Speicherzugriffs eben nicht nachvollziehen. Das ist deine Aufgabe als Programmierer, sobald du dynamisch Speicher reservierst.
    Es gibt eine Zusatztools/Librarys die dabei helfen solche ungültigen Zugriffe zur Laufzeit zu finden.

    bis bald
    akari



  • Und noch ein weiterer Fehler steckt in deinem Programm: Du holst dir Speicher für EINEN int und greifst auf diesen und die nächsten (8) Bytes zu - arr[1] und arr[2] gehören die nicht.

    (um größere Blöcke anzufordern, nimmt man arr=new int[3]; )



  • Du hast vorher schon eien Fehler. Du alloziiert einen Speicherbereich für einen int und greifst dann auf arr[1] zu, was schon ausserhalb deines Speicherbereiches liegt.

    (@CStoll: warst schneller 😉 )



  • Eigentlich wollte ich nur irgendwie einen Speicherzugriffsfehler provozieren 😃

    Die Fehler oben sind mir schon bewusst, nur hab ich halt nicht gewusst dass der das einfach akzeptiert. Naja, muss jetzt ein bisschen umdenken, irgendwann werde ich die Pointer auch kapieren. 🙂

    Nochmals danke für die antworten 👍



  • @tntnet: Und wie ich bemerkt habe, war ich auch nur zweiter 😉

    @Rookie: Das ist das Problem an undefiniertem Verhalten - du kannst nicht annehmen, daß dein System auf eine bestimmte Weise reagiert (mit viel Glück gehört der verwendete Speicher tatsächlich niemandem und dann läuft das Programm tatsächlich ohne Probleme durch).



  • Rookie86 schrieb:

    Eigentlich wollte ich nur irgendwie einen Speicherzugriffsfehler provozieren 😃 ...

    na, das geht aber einfacher mit

    int* i = 0;
       *i += 12;
    

    Gruß,

    Simon2.


Anmelden zum Antworten