Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Richtig/sauber freigeben - nur wie? (https://www.delphipraxis.net/141341-richtig-sauber-freigeben-nur-wie.html)

LDericher 7. Okt 2009 11:30


Richtig/sauber freigeben - nur wie?
 
Hallo DP!

Fast ist es mir peinlich, so eine Frage zu stellen, aber ich glaube, ich hab das nie richtig gelernt/kapiert:

Ich habe (beispielsweise) folgende Struktur:
Delphi-Quellcode:

  TFontSpec=record
    vFontID:integer;
    vFamily:TFontFamily;
    vName:string;
  end;

  TFontTable=class
  private
    vContent:array of TFontSpec;
    {...}
  public
    constructor Create;
    {...}
    destructor Destroy; override;
  end;
Und würde natürlich gerne auch sauber freigeben, was ich an Speicher verbrate.

Bis jetzt habe ich im Destruktor allerdings nur
Delphi-Quellcode:
SetLength(vContent, 0);
stehen. Meines Wissens nach gibt das den Speicher aber noch nicht wieder frei:cry:
Und wie man (hier) mit FreeMem/Finalize/Initialize/New/etc. ist mir leider noch ein Rätsel; ich weiß auch nicht, wo(bestimmt gibts was hier :D) ich wie(?????) anfange sollte zu suchen :(

Wäre euch sehr dankbar, wenn ihr mich an ein andres Thema verweisen könntet, wo was dazu steht (oder schnell selbst ne verständliche Erklärung hintippt :))

Danke schonmal im Voraus,
Euer LDer.

rweinzierl 7. Okt 2009 11:36

Re: Richtig/sauber freigeben - nur wie?
 
Hallo

Meine Grundregel lautet, nur was ich mit .create anlege muss ich mit .free auch wieder freigeben.

==> Da ich den Record nicht .create anlege muss ich mich nicht um die freigabe kümmern.
( Ich hoffe ich habe Recht)


mfg

Reinhold



------------
www.ithof.de Arzneimittelbuch für Tierhalter

Phoenix 7. Okt 2009 11:39

Re: Richtig/sauber freigeben - nur wie?
 
Zitat:

Zitat von LDericher
Delphi-Quellcode:

  TFontSpecification = record
    FontID: integer;
    Family: TFontFamily;
    Name: string;
  end;

  TFontSpecificationArray = array of TFontSpecification;

  TFontTable=class
  private
    fontSpecifications: TFontSpecificationArray;
    {...}
  end;

Das ist das, was ich als erstes machen würde ;-)
Aber davon mal abgesehen, das SetLength auf 0 sollte den Speicher defakto auch wieder freigeben.

Ausser natürlich, TFontFamily ist ein Objekt oder ein Struct, welches Objekte enthält.
Das bedeutet, du müsstest dann vorher im Destruktor deiner Table durch fontSpecifications durchlaufen und alle Objekte in dem Array manuell freigeben.
Betrifft wie gesagt nur Objekte - Structs und Wertetypen sind aussen vor, die werden sofort sauber freigegeben.

Sir Rufo 7. Okt 2009 11:46

Re: Richtig/sauber freigeben - nur wie?
 
Zitat:

Zitat von rweinzierl
Hallo

Meine Grundregel lautet, nur was ich mit .create anlege muss ich mit .free auch wieder freigeben.

==> Da ich den Record nicht .create anlege muss ich mich nicht um die freigabe kümmern.
( Ich hoffe ich habe Recht)


mfg

Reinhold



------------
www.ithof.de Arzneimittelbuch für Tierhalter

Ja und Nein ... darum gibt es z.B. bei TObjectList die Property OwnsObjects.
Im Destroy werden dann auch die angehängten Objekte vernichtet (OwnsObjects = True).
Man kann sich hier also entscheiden.

Letztendlich hängt es vom Code ab, ob die angehängten Objekte aus dem Speicher entfernt werden sollen oder nicht.

himitsu 7. Okt 2009 12:08

Re: Richtig/sauber freigeben - nur wie?
 
Wie rweinzierl schon sagt, muß man vorallem erstmal alles selber freigeben, welches mal per .Create (oder Funktionen, wo das drinsteckt), New, GetMem und Co. selber angelegt hat und wo soich natürlich kein Anderer um die Freigabe kümmert.

Ausnahmen sind Objekte in ObjektListen, welche die enthaltenen Objekte selber freigeben, wenn man die Objektliste freigibt.

Strings, dynamische Arrays und Interfaces werden von Delphi freigegeben.
> Ausnahmen sind wiederum z.B. Sachen in Records innerhalb eines Arrays, welche man selber angelegt hat



also Fazit:
dein Array und die Strings darin würden im Destructur von Delphi automatisch freigegeben,
aber es kann nicht schaden, wenn du es selber freigibst.


Im Endefekt kannst du auch mal FastMM einbauen und dessen Speicherüberwachung aktivieren
oder ein anderes Kontrollprogramm installieren, welches prüft, ob du alles freigegeben hast.

LDericher 7. Okt 2009 12:27

Re: Richtig/sauber freigeben - nur wie?
 
Alles klar, klingt gut, dann hab ich ja doch nich so viel falsch gemacht, wie ich dachte :)
Übrigens, mein TFontFamily ist ein ENUM ;) also müsste's ja auch freigegeben werden :D

Bis dann,

Gruß,
LDer.

Muetze1 7. Okt 2009 13:00

Re: Richtig/sauber freigeben - nur wie?
 
Eine weitere Ausnahme: Komponenten. Der im Konstruktor übergebne Owner kümmert sich bei seiner Freigabe um die ihm zugeteilten Komponenten.

sirius 7. Okt 2009 13:15

Re: Richtig/sauber freigeben - nur wie?
 
Zitat:

Zitat von Muetze1
Eine weitere Ausnahme: Komponenten. Der im Konstruktor übergebne Owner kümmert sich bei seiner Freigabe um die ihm zugeteilten Komponenten.

Komponenten sind aber wieder die ausnahme in der ausnahme :mrgreen: Denn hier kannst du frei eintscheiden, ob du sie selber freigeben willst oder ob es der owner machen soll. Bei einer TObjectlist darfst du das Objekt nicht freigeben wenn du Ownsobjects auf true hast. (Naja, dürfte hier auch soweit allen klar sein, ist nur für Anfänger recht schwer zu durchschauen)

LDericher 7. Okt 2009 13:43

Re: Richtig/sauber freigeben - nur wie?
 
Die Regeln die ihr hier aufgeschrieben habt, kannte ich soweit schon, nur war ich nicht sicher, ob Standardtypen wie strings, integer, enums, booleans(...) atomatisch bereinigt werden ;)
Trotzdem danke für eure Mühe!

Grüße natürlich noch :D,
Der LDer.

himitsu 7. Okt 2009 13:49

Re: Richtig/sauber freigeben - nur wie?
 
Integer, Enums und Booleans reservieren ja keinen eigenen/eigenständigen Speicher, liegen direkt im Record und werden somit samt dem zugehörigen Record entsorgt.

Strings (abgesehn vom ShortString), dynamische Arrays, Objekte und Interfaces sind dagegen im Record "nur" Zeiger auf die entsprechenden Daten.


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:41 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz