Announcement

Collapse
No announcement yet.

new - delete

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

  • new - delete

    Hallo zusammen!

    Wenn ich zur Laufzeit mit new ...(this) zum Beispiel ein Edit erzeuge, muß dann hinterher mit
    delete wieder der Speicher freigegeben werden oder übernimmt das der Destruktor?

    Gruß Irmgard

  • #2
    Hi Irmgard!<br>

    Alles was Du mit new erzeugst, solltest Du auch mit delete wieder<br>
    freieben. Ansonsten hast Du Speicherlecks, denn erst wenn Du Dein<br>
    Hauptprogramm beendest wird der Speicher freigegeben.<br>
    Ausnahme: Du hast einen Zeiger auf TEdit schon in der Headerdatei<br>
    definiert, dann macht das auch der Destruktor, so schreibt man aber<br>kein Programm denke ich.<br>

    Gruß Fre

    Comment


    • #3
      Ich nochmal!<br>

      Wenn man nach der Beschreibung geht, löscht immer der Owner das im<br>
      unterstellte Objekt, also der welcher bei der Erzeugung übergeben<br>
      wurde....(TComponent *Owner)<br>

      Gruß Fre

      Comment


      • #4
        Hallo Fred!

        Das heißt also, daß man für alle Fälle doch delete nehmen muß. Ich hatte gehofft, daß das vielleicht die Basiskomponente durch this übernimmt. Habe das noch nicht so ganz begriffen. Vielen Dank für Deine Hilfe!

        Gruß Irmgar

        Comment


        • #5
          Hallo Fred!

          Das ist mir noch nicht so ganz klar. Um bei dem Beispiel zu bleiben

          TEdit* edit = new TEdit(this);

          edit->Parent = this;

          edit->Left...

          ...

          dann erzeuge ich doch ein Edit zur Laufzeit genauso wie zur Entwurfszeit, wenn ich die Komponente auf dem Form ablege. Da brauche ich hinterher den Speicher nicht freizugeben. Folglich brauch ich doch im ersten Fall auch keinen Speicher mehr freizugeben - oder liege ich da falsch?

          Gruß Irmgar

          Comment


          • #6
            Hallo Irmgard,

            In der Hilfe steht unter TComponent::Owner<br>
            ...<br><i>
            Wenn eine Komponente einer anderen Komponente untergeordnet ist, wird ihr Speicher freigegeben, sobald der Speicher der übergeordneten Komponente freigegeben wird. Das bedeutet, daß alle Komponenten eines Formulars aufgelöst werden, wenn das Formular selbst aufgelöst wird.</i><br>
            ...<br>
            Das bedeutet meiner Meinung nach, dass das TEdit zerstört wird, wenn this zerstört wird.<br>
            Das funkioniert wohl auch. Beispiel:<br>
            Leite von TEdit eine eingene Klasse class TMyEdit:ublic TEdit ab und überprüfe dann wann der Destruktor aufgerufen wird. Bei mir wurde der D'tor aufgerufen, als das übergeordnete Form zerstört wurde. Du kannst ja mal probieren wie es sich bei Dir verhält.

            Gruß Thorste

            Comment


            • #7
              Hallo Thorsten!

              Vielen Dank für Deine Hilfe! Da ich bisher noch nie eine eigene Klasse abgeleitet habe und auch nicht weiß, wie ich den Destruktor überprüfen soll, lasse ich mal lieber im Moment die Finger davon und glaube Dir das jetzt einfach so.

              Gruß Irmgar

              Comment


              • #8
                Hi Irmgard!
                Thorsten hat komplett recht, der Besitzer zerstört(destroy/delete) seine untergeordneten Objekte, sofern ->Parent(Owner) gesetzt ist.
                Nur manchmal braucht man ja Objekte die die canvas des Formulars
                garnicht benutzen und wo parent nicht gesetzt ist. Diese sollte
                man in FormClose( oder gleich nach Gebrauch) wieder freigeben.
                Bei mir hat sich das so eingebürgert, daß ich alles was ich selbst
                definiere auch selbst wieder freigebe( alter C-Stil ).<br>
                Damit bist Du immer auf der sicheren Seite.

                Gruß Fre

                Comment


                • #9
                  Hi Fred,

                  mache ich auch so, ich setze alle Zeiger im c'tor auf NULL und prüfe im d'tor ob sie immer noch NULL sind, wenn nicht müssen Sie also noch auf eine Instanz zeigen werden und werden dann von mir zerstört. Das geht natürlich nur, wenn man beim Zerstören einer Instanz mitten im Code den entsprechenden Zeiger wieder auf NULL setzt.

                  Nochmal zum automatischen Zerstören: Irgendwo hatte ich einmal das Problem das BCB die Instanz automatich deletet hat und da bin natürlich übel auf die Nase gefallen beim späteren delete-Versuch im d'tor. BCB setzt die Zeiger leider nicht auf NULL nach dem Löschen. Deshalb sollte man es schon wissen, das die Möglichkeit besteht das BCB eine Komponente selbst zerstören kann, sonst sucht man lange nach dem Fehler...

                  Gruß Thorste

                  Comment


                  • #10
                    Hi Thorsten!<br>
                    Find ich irgenwie gut das ich nicht der einzige bin, der auf<br>
                    solche doofen Borlandfehler reingefallen ist.<br>
                    Sorry war nich gehässig gemeint->eher Richtung Borland.<br>
                    In den letzten 10 Jahren habe ich mir zur Devise gemacht,<br>
                    suche erst den Fehler bei Borland und dann bei dir selbst.<br>

                    Gruß Fre

                    Comment

                    Working...
                    X