dynamische variable mit funktion erstellen und löschen - ungültiger zeiger



  • Hi,

    wenn ich folgendes Programm ausführe bekomme ich sowas wie: glibc detected invalid pointer free()...und dann noch so eine unübersichtliche memory map...

    #include <iostream>
    using namespace std;
    
    void erzeuge_int (int*);
    void loesche (*int*);
    
    int main (void)
    {
      int zahl;
      int *zeiger;
      zeiger = &zahl;
    
      // ...
    
      erzeuge_int (zeiger);
      *zeiger = 159;
    
      // ...
    
      loeschen (zeiger);
      return 0;
    }
    
    void erzeuge_int (int *ptr)
    {
      ptr = new(nothrow) int;
    }
    
    void loeschen (int *del)
    {
      delete del;
    }
    

    Woran liegt das?

    Ich hab das jetzt absichtlich nicht über einen möglichen rückgabewert von erzeuge_int gemacht, sondern wollte das mal so testen...soll das nicht funktionieren?

    Achso, und wenn ich die variable weglasse und den zeiger direkt mit int *zeiger = 0; initialisiere, krieg ich als fehlermeldung "segmentation fault"...?!



  • Bei delete zeigt 'zeiger' noch immer auf 'zahl', weil 'erzeuge_int' diesen nicht ändert.



  • und wie muss man das hier ändern, damit zeiger die adresse von ptr übernimmt. ist das überhaupt möglich, oder muss ich das via return machen?!



  • void erzeuge_int (int **ptr)
    {
      *ptr = new(nothrow) int;
    }
    


  • TyRoXx schrieb:

    void erzeuge_int (int **ptr)
    {
      *ptr = new(nothrow) int;
    }
    

    dann ändert sich der aufruf aber auch
    außerdem könnte man hier auch ne ref auf nen ptr nehmen... dann kommt gar niemand auch niemand auf die idee, 0 zu übergeben...
    für nothrow muss man btw den header new includieren

    bb


Anmelden zum Antworten