Announcement

Collapse
No announcement yet.

TTreeView die zweite

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • TTreeView die zweite

    Ich hatte ja das Problem mit der Data-Eigenschaft von TreeNode. Dort steht jeweils ein zeiger auf eine eigene Klasse drin. Beim Generieren des treeView wird die eigene Klasse instanziiert, also Speicher mit new reserviert.

    Den wollte ich jetzt im OnFormDestroy wieder freigeben. Ich durchlaufe also den TreeView und lösche in den einzelnen Knoten das Data Element.

    TKnoten *knoten;

    for( int i=TreeView1->Items->Count-1; i>=0; i-- ) {
    knoten = (TKnoten *) TreeView1->Items->Item[i]->Data;
    delete[] knoten;
    knoten = NULL;
    }

    Folge ist ein Totaler Programmabsturz bzw. eine AccessViolation. Wo denke ich falsch? Im Debugger sehe ich den TreeView noch und auch der Zeiger knoten zeigt auf korrekte Daten.

    Anders als über die Zeiger in den TreeNode Objekten komme ich an die Instanzen ja nicht mehr dran.

    Schon mal danke für Eure Hilfe.

    Manfred

  • #2
    Warum willst du ein Array deleten??

    delete knoten;


    EDIT

    Des Weiteren:

    knoten ist schon ein Zeiger, also

    knoten = (TKnoten)

    und das Setzen auf NULL ist obsolet, der nächste Schleifendurchlauf lauert schon

    Die Schleife ist "umständlich"

    for(i=0;i<TreeView1->Items->Count;i++)
    Zuletzt editiert von Christian Marquardt; 10.07.2007, 14:53.
    Christian

    Comment


    • #3
      Hallo Christian,

      weil irgendwo mal stand, daß man Klassen bzw. deren Instanzen mit delete[] löschen (Speicher freigeben) soll. Aber gut, das ist auch ein Buch aus dem Jahr 1997. Mit delete funktioniert das *freu* und Danke!

      Auf Null setze ich den Zeiger, damit er nicht 'irgendwo' hinzeigt. Klar beim Beenden des programms ist das auch egal, aber ist so eine Gewohnheit, damit kein Zeiger wo hinzeigt wo 'Nichts' mehr ist.

      *lach* Nun ich gehe die Liste halt von hinten nach vorne durch, geht natürlich auch umgekehrt. Das war ein c&p aus dem Durchsuchen der Liste beim Aufbau zu Laufzeitoptimierung.

      Comment


      • #4
        Auf Null setze ich den Zeiger, damit er nicht 'irgendwo' hinzeigt.
        Joo, grundsätzlich schon klar, aber in diesem Fall wurscht, da dem Zeiger ja gleich beim nächsten Schleifendurchlauf was neues verpasst wird.

        Hauptsache es geht
        Christian

        Comment


        • #5
          Du hast mal wieder Recht. Eiegntlich wollte ich ja auch Data auf Null setzen und nicht den Zeiger ...... aber auch das ist ja nicht notwendig, da der ganze TreeView eh am Ende der methode platt ist.

          Comment


          • #6
            Die Frage ist eigentlich, wer gibt den Speicher der Daten wieder frei - TTreeView oder wer sonst ???

            Comment


            • #7
              So wie ich das verstanden habe muß man das wohl selbst machen.

              Deshalb durchlaufe ich den TreeView im FormDestroy und führe ein delete auf die Data Eigenschaft der Nodes aus. Da sich im Data Element ein zeiger befindet, wird mit delete der Speicher auf den der zeiger zeigt frei gegeben.

              Bitte korrigiere mich jemand, wenn ich das falsch verstanden habe.

              Comment

              Working...
              X