kostenloser Webspace werbefrei: lima-city


Destructor in Delphi

lima-cityForumProgrammiersprachenDelphi & Pascal

  1. Autor dieses Themas

    stef264

    stef264 hat kostenlosen Webspace.

    Ich habe eine kleine Frage zum Thema Delphi bzw. die auch Allgemein zu verstehen ist.
    Ich habe eine Klasse A und eine Klasse B die 5000 Objekte der Klasse A erstellt und in einem Array-Attribut speichert. Nun wird am Ende nur die Klasse B benutzt und am Ende "destroyed" werden dann automatisch auch alle Objekte der Klasse A die ich in der Klasse B benutzt habe "destroyed" ?

    MFG Stefan
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. burgi

    Co-Admin Kostenloser Webspace von burgi

    burgi hat kostenlosen Webspace.

    Ohne es genauer zu wissen, oder belegen zu können, behaupte ich mal: nein, der Speicher für die Objekte wird nicht automatisch freigegeben.
    Da du dich selbst um das Erstellen der 5000 Objekte kümmerst, musst du dich auch selbst um das Bereinigen der Objekte kümmern. Delphi hat meines Wissens nach keinen "Garbage-Collector", wie beispielsweise Java.
    Selbst wenn Delphi das für dich automatisch erledigen würde, ist es zumindest ein sehr sehr schlechter Programmierstil, den du dir von vornherein gar nicht angewöhnen solltest.

    Nochmal recherchiert: ich hatte teilweise Recht:
    http://www.delphi-treff.de/object-pascal/konstruktordestruktor/#c4951
    Win32 verhält sich da wohl anders als .NET
  4. Autor dieses Themas

    stef264

    stef264 hat kostenlosen Webspace.

    Also sollte ich jetzt für einen guten Programmierstil alle Objecte einfach über eine Schleife "destroyen" oder wäre jetzt "free" besser?
  5. destroy sollte nie direkt aufgerufen werden.

    FreeAndNil(A);
    FreeAndNil(B);

    .
  6. burgi

    Co-Admin Kostenloser Webspace von burgi

    burgi hat kostenlosen Webspace.

    stef264 schrieb:
    Also sollte ich jetzt für einen guten Programmierstil alle Objecte einfach über eine Schleife "destroyen" oder wäre jetzt "free" besser?

    Google ist dein Freund:
    http://www.delphipraxis.net/705207-post3.html
    Solltest du lesen ;-)
    Auch nicht uninteressant:
    http://stackoverflow.com/questions/3159376/which-is-preferable-free-or-freeandnil
  7. Man könnte aber auch auf das Array verzichten und stattdessen eine TObjectList verwenden (Unit Contnrs). Im Destruktor der enthaltenden Klasse muss man dann nur diese freigeben, sofern man den optionalen Parameter OwnsObjects in deren Konstruktor auf der Standardeinstellung true belässt. Mögliche Vorgehensweise:
    uses ..., Contnrs;
    
    type
      TUnterklasse = class
      ...
      end;
    
      TDeineKlasse = class
      private
        FObjects: TObjectList;
        function GetObject(Index: integer): TUnterklasse;
        ...
      public
        constructor Create;
        destructor Destroy; override;
        property Objects[Index: integer]: TUnterklasse read GetObject; default;
        ...
      end;
    
    constructor TDeineKlasse.Create;
    begin
      inherited;
      FObjects := TObjectList.Create;
      ...
    end;
    
    destructor TDeineKlasse.Destroy;
    begin
      FObjects.Free;
      ...
      inherited;
    end;
    
    function TDeineKlasse.GetObject(Index: integer): TUnterklasse;
    begin
      if (Index < 0) or (Index >= FObjects.Count) then
        raise EListError.Create('Index außerhalb des gültigen Bereichs');
      Result := FObjects[Index] as TUnterklasse;
    end;
  8. Hi,
    Es kommt auch auf deine delphi version an.
    Wenn du eine "normale" delphi version hast, hast du keine garbage collection
    (Wennich dich richtig verstehe ist das ja das was du willst).
    Nutzt du eine .net version von delphi sollte die garbage collection implizit eingebaut sein.

    Gruß
  9. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!