delete() im Destruktor der Klasse ?!



  • Irgendwie bin ich nicht so recht fundig gewurden, was dies betrifft. Wahrscheinlich ist es auch nur ein Denkfehler aber emmpf..
    Folgendes Problem:
    in einer Klasse deklariere ich einen Zeiger auf eine andere Klasse. Dieser wird aber nur verwendet wenn der Bedarf entsteht. Im Destruktor der Klasse will ich den Speicher wieder freigeben, wenn er denn angefordert wurde.
    Als Beispiel :

    class USER 
    {  bool      hasdir;
       DIRINFO** navdir;
       User()
       {   hasdir = false;
           navdir = NULL;
       };
       int action(char type)
       {  int result = 0; 
          if(type = 'a')
          {   if(hasdir) delete &navdir;
              hasdir = true;
              DIRINFO* ndir = new DIRINFO();
              ndir->tuwas();
              navdir = &ndir;
              result = 1;
          };
       return result;
       };
       ~User()
       {  if(hasdir) delete &navdir;         // <- Hier fliegt mir dann der VC++
       };                                    // mit Detected memory leaks! ab
    };
    

    Ich muss doch auch am Ende der Klasse des Speicher wieder freigeben ?
    Was mache ich falsch !?!



  • Ich würde einmal sage was du wirklich willst ist:

    delete *navdir;
    

    Kurt



  • 😕 🕶
    Ja das war´s dann . DANKE !



  • rasi dein code sieht sehr schlecht aus.



  • hi Tipp, gut (oder schlecht) warum ?

    Manche Tage ....
    das ganze Problem geht noch etwas weiter..
    Die Klasse DIRINFO enthält einen Vector, wenn ich jetzt meinen User 'zerstöre'
    kriege ich eine Ausnahme im Destruktor der Klasse DIRINFO. Dieser Fehler tritt
    aber nur auf, wenn ich die Speicher mit new() / delete() verwalte. Lege ich den gesamten Speicher schon im Konstruktor von USER an also
    nicht

    ...  DIRINFO** navdir
    // sondern
    ... DIRINFO navdir
    

    passiert dies nicht. (ich brauche den Speicher wirklich seltner !)
    Vielleicht weiter im Beispiel :

    class DIRINFO
    {  short int anz;
       vector <HTMLTABLEHEAD> TableHead;
       DIRINFO()
       { anz = 0; };
       void init()
       { HTMLTABLEHEAD col;
         col.text = "Spalte 1";
         TableHead.push_back(col);
       };   
    };
    

    Einen Destruktor habe ich nicht extra geschrieben, (Habs´s aber auch damit probiert. Ein "TableHead.clear()" hat´s dann auch nicht gebracht 😕 )
    Hat vielleicht jemand eine Idee ??



  • class USER 
    {  int action(char type)
       {  int result = 0; 
          if(type = 'a')
          {   if(hasdir) delete &navdir;
              hasdir = true;
              DIRINFO* ndir = new DIRINFO();   // ndir ist eine lokale Variable
              ndir->tuwas();
              navdir = &ndir;                  // navdir zeigt auf ndir
              result = 1;
          }
    
          // !!! wir verlassen den Scope und damit existiert ndir nicht mehr !!!
          // !!! ==> navdir zeigt in's Nirvana                               !!!
    
          return result;
       }
    };
    


  • also ich hab schon Zuk Änderungen umgesetzt, das war wirklich etwas nachtmützig 😃
    nun aber meinen Speicher hab ich schon, dafür hab ich ihn auch extra angefordert und der bleibt meines wissens erhalten, bis ich ihn mit delete freigebe, oder ??

    class USER
    {  bool      hasdir;
       DIRINFO** navdir;
       User()
       {   hasdir = false;
           navdir = NULL;
       };
       int action(char type)
       {  int result = 0;
          if(type = 'a')
          {   if(hasdir) delete *navdir;
              hasdir = true;
              DIRINFO* ndir = new DIRINFO();
              ndir->tuwas();
              navdir = &ndir;
              result = 1;
          };
       return result;
       };
       ~User()
       {  if(hasdir) delete *navdir;         // <- zu geht´s dann auch !
       };                                    
    };
    

    Nur leider bleibt doch die letzte (??) Frage noch !



  • gut hab´s gescheckt, der Zeicger auf den Zeiger ist wech 😞
    Nur wie löse ich das Problem ??????? 😕



  • Mit new erzeugst du ein Objekt vom Typ DIRINFO, welches solange existiert, bist du es mit delete löscht (Speicher freigeben) - bis dahin ist es richtig. navdir zeigt aber auf die lokale Variable ndir. Dadurch wird der Zeiger beim Verlassen des Gültigkeitsbereiches von ndir ungültig (er zeigt auf eine Variable, die gar nicht mehr existiert). Lass das Gedöns mit dem Doppelzeiger weg.

    class USER
    {  DIRINFO* navdir;
       User()
       {   
          navdir = NULL;
       };
       int action(char type)
       {  int result = 0;
          if(type = 'a')
          {   if(navdir) delete navdir;
              navdir = new DIRINFO();
              navdir->tuwas();
              result = 1;
          };
       return result;
       };
       ~User()
       {  if(navdir) delete navdir;
       };                                    
    };
    

Anmelden zum Antworten