Problem mit delete[]



  • Hey,

    ich hab eine Frage zu delete: WARUM GEHT DAS NICH SO:

    irgendwo steht:

    int* p = new int [10];
    

    wenn ich in ner Funktion

    Logfile.Log( (int) p );
    delete[] p;
    Logfile.Log( (int) p );
    

    mache passiert folgendes:
    Der erste Log zeigt ne Zahl, der 2. aber die selbe. Gibt delete den Speicher frei, lässt aber den Zeiger wo er is oder legt erst nach beenden der Funkion los? Ich brauch dann gleich den Zeiger clean. Woran liegt das, das p nach delete noch nen Wert hat?

    Ciao, Alfred



  • Hallo,

    der Speicher wird freigegeben, der Zeiger zeigt aber weiterhin auf die selbe
    Speicheradresse. Und solange der Inhalt dieser Speicheradresse sich nicht
    aendert, ist der alte Wert an dieser Adresse noch vorhanden.

    Dennoch waere ich damit vorsichtig, dein Programm koennte beim Zugriff auf
    den Zeiger, nachdem du den Speicher wieder freigegeben hast, auch abstuerzen.

    mfg
    v R



  • Was es auch zur genüge tut. Also lieber

    delete[] p;
    p = NULL;
    

    im Doppelpack benutzen, wenn ich danach wieder ein neues Feld für p reservieren möchte.



  • Mir fliegt mein Programm jetzt immer bei

    p= new char[ 15 ];
    
      // p benutzen...
    
      if ( p != NULL )
      {
        delete[] p;
        p = NULL;
      }
    

    um die Ohren, und zwar genau bei dem delete. Aber nicht immer, sondern nur wenn ich die Funktion 2x aufruf. p ist im header als char* definiert. Woran liegt das?



  • Wahrscheinlich hast du irgendwas in der aufrufenden Funktion gemacht, was das
    Programm hier veranlasst abzustuerzen.

    Du solltest keinen Speicher in einer aufgerufenen Funktion reservieren oder nur,
    wenn du ihn in der aufgerufenen Funktion auch wieder frei gibst. Ansonsten
    ueberlass es der aufrufenden Funktion, denn sonst verlierst du irgendwann den
    Ueberblick und weisst nicht mehr, wo du Speicher reservierst und wo du Speicher
    freigegeben hast.

    mfg
    v R


Anmelden zum Antworten