AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Richtig/sauber freigeben - nur wie?

Ein Thema von LDericher · begonnen am 7. Okt 2009 · letzter Beitrag vom 7. Okt 2009
Antwort Antwort
Seite 1 von 2  1 2   
Benutzerbild von LDericher
LDericher

Registriert seit: 29. Jan 2007
Ort: Erkelenz
224 Beiträge
 
Delphi 7 Enterprise
 
#1

Richtig/sauber freigeben - nur wie?

  Alt 7. Okt 2009, 12:30
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
SetLength(vContent, 0); stehen. Meines Wissens nach gibt das den Speicher aber noch nicht wieder frei
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 ) 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.
"Clicking this button you agree with our Verantwortungsverzicht und Abkommen."
Zitat von Ein unentschlossener Programmierer:
Enabled:=true or false or true or false or true or false;
  Mit Zitat antworten Zitat
Benutzerbild von rweinzierl
rweinzierl

Registriert seit: 22. Mär 2005
98 Beiträge
 
#2

Re: Richtig/sauber freigeben - nur wie?

  Alt 7. Okt 2009, 12:36
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
  Mit Zitat antworten Zitat
Benutzerbild von Phoenix
Phoenix
(Moderator)

Registriert seit: 25. Jun 2002
Ort: Hausach
7.604 Beiträge
 
#3

Re: Richtig/sauber freigeben - nur wie?

  Alt 7. Okt 2009, 12:39
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.
Sebastian Gingter
Phoenix - 不死鳥
Mein Blog: http://gingter.org
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#4

Re: Richtig/sauber freigeben - nur wie?

  Alt 7. Okt 2009, 12:46
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.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.017 Beiträge
 
Delphi 12 Athens
 
#5

Re: Richtig/sauber freigeben - nur wie?

  Alt 7. Okt 2009, 13:08
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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von LDericher
LDericher

Registriert seit: 29. Jan 2007
Ort: Erkelenz
224 Beiträge
 
Delphi 7 Enterprise
 
#6

Re: Richtig/sauber freigeben - nur wie?

  Alt 7. Okt 2009, 13:27
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

Bis dann,

Gruß,
LDer.
"Clicking this button you agree with our Verantwortungsverzicht und Abkommen."
Zitat von Ein unentschlossener Programmierer:
Enabled:=true or false or true or false or true or false;
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#7

Re: Richtig/sauber freigeben - nur wie?

  Alt 7. Okt 2009, 14:00
Eine weitere Ausnahme: Komponenten. Der im Konstruktor übergebne Owner kümmert sich bei seiner Freigabe um die ihm zugeteilten Komponenten.
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#8

Re: Richtig/sauber freigeben - nur wie?

  Alt 7. Okt 2009, 14:15
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 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)
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
Benutzerbild von LDericher
LDericher

Registriert seit: 29. Jan 2007
Ort: Erkelenz
224 Beiträge
 
Delphi 7 Enterprise
 
#9

Re: Richtig/sauber freigeben - nur wie?

  Alt 7. Okt 2009, 14:43
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 ,
Der LDer.
"Clicking this button you agree with our Verantwortungsverzicht und Abkommen."
Zitat von Ein unentschlossener Programmierer:
Enabled:=true or false or true or false or true or false;
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.017 Beiträge
 
Delphi 12 Athens
 
#10

Re: Richtig/sauber freigeben - nur wie?

  Alt 7. Okt 2009, 14:49
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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:50 Uhr.
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