Announcement

Collapse
No announcement yet.

Speicher freigeben

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

  • Speicher freigeben

    wo und wann soll ich den mit new reservierten Speicher für dne Zeiger wieder freigeben?
    Danke und Gruss
    Armin

    procedure TTestClassA.getListe(var List: TList);
    var
    PTestRecord : ^TTestRecord;
    begin
    new(PTestRecord);
    PTestRecord^.FeldA := 'Hallo';
    PTestRecord^.FeldB := 'Test';
    PTestRecord^.FeldC := 1;
    List.Add(PTestRecord);
    Result := List;
    end;

    procedure TForm1.Button1Click(Sender: TObject);
    var
    List : TList;
    TestClassA : TTestClassA;
    PTestRecordKopie : ^TTestRecord;
    begin
    List := TList.Create;
    TestClassA := TTestClassA.Create;
    TestClassA.getListe(List);
    PTestRecordKopie := List.Items[0];
    Label1.Caption := PTestRecordKopie^.FeldA;
    TestClassA.Free;
    List.Free;
    end;


  • #2
    Hallo Armin,
    soweit ich weiß, wird bei List.Clear der mit den Items assoziierte Speicher automatisch freigegeben, so daß man das nicht selber von Hand machen muß.
    Viele Grüße,
    Marku

    Comment


    • #3
      Hi Marcus,
      Vorsicht, es ist schon richtig, der mit Items assoziierte Speicher wird freigegeben.
      Aber das Object vom Typ TList <B>muss</B> explizit freigegeben werden, denn auch ohne Items belegt es Speicher.
      Prinzipiell sollte das auch immer in einem Try Finally - Block passieren.
      <CODE>
      List := TList.Create;
      try
      TestClassA := TTestClassA.Create;
      try
      .. Bearbeitung
      finally
      TestClassA.Free;
      end;
      finally
      List.Free;
      end;
      </CODE>
      Gruß, Fran

      Comment


      • #4
        Aber in meinem Fall ist es doch so, dass eben der Speicher des Records nicht freigegeben wird, weil die Liste ja nur einen Zeiger enthält (es wird nur der Speicher des Zeigers selbst freigegeben, oder?)

        Comment


        • #5
          Hallo Armin,
          das ist korrekt.
          In deinem speziellen Fall würde ich den Record im Constructor des Forms erzeugen und im Destructor mit Dispose den Speicher freigeben. Du solltest garantieren, dass der Record solange existiert, wie auch List und TestClassA existieren.
          Übrigens übergibt man Objecte nicht als Var - Parameter.
          statt
          procedure TTestClassA.getListe(<B>var</B> List: TList);
          procedure TTestClassA.getListe(List: TList);
          Delphi übergibt Objekte immer per Referenz und nicht per Value.
          Var solltest du bei Strings, dyn. Arrays und Records benutzen.
          Das Result in der Procedure ist sicher ein Schreibfehler.
          Eine Alternative wäre noch, den Record in der Procedure Button1Click zu definieren, Speicher reservieren, an die Procedure TestClassA mit übergeben und in Button1Click den Speicer des Records als letztes wieder freizugeben.
          Gruß, Fran

          Comment


          • #6
            Hallo Frank

            Besten Dank für Deine Infos.
            Ich hätte vielleicht mein Listing nicht kürzen sollen ;-) Mein Problem ist nämlich folgendes: Ich weiss nicht wie viele Einträge die Liste hat, die ich mit getListe zurück kriege... Das ist immer unterschiedlich. Darum kann ich wohl den Speicher auch nicht im Konstruktor reservieren (ich weiss ja nicht wie viel) und ich kann auch keinen Zeiger übergeben (da eben evtl. mehrere Einträge zurückgegeben werden müssen)...

            Gibt's trotzdem eine Lösung für mein Problem?

            Danke und Gruss

            Armi

            Comment


            • #7
              Hallo Armin,

              du kannst evtll. vor dem Freigeben von List mit
              for i:= 0 to List.Count-1 do
              Dispose(List.Items[i]);
              List.Free;
              das Problem lösen.
              Damit sollte der Speicher der Records freigegeben werden.<BR>
              Fran

              Comment


              • #8
                Hallo!
                Du musst sogar den Speicher wieder freigeben, wenn Du sauber arbeiten möchtest. Bei einer tList wird der Speicher auf den die Elemente zeigen nicht freigegeben, wenn nur destroy oder free aufgerufen werden.

                Gruß
                Bod

                Comment


                • #9
                  Hallo alle

                  Erst mal danke für die Tipps. Ich bin jetzt so vorgegangen wie es Frank beschrieben hat. Was meinst Du Bodo mit Speicher freigeben? Kann ich das nicht mit Frank's Dispose machen? Bzw. ich hatte jetzt Dispose(PTestRecord(List.Items[i])); vorgesehen..

                  Comment


                  • #10
                    Ist genau richtig mit Dispose

                    Comment

                    Working...
                    X