Her et par tommelfingerregler, der sikrer korrekt memory håndtering. Der er
mange andre måder at gøre det på, men nedenstående regler er en god måde:
- Hvis b er en del af a, er a ejeren af b.
- Hvis et objekt oprettes i en konstruktor, skal det nedlægges i en
destruktor.
- Hvis et objekt oprettes i en OnShow event, skal det nedlægges i en OnHide
event.
- Hvis et objekt ejes af et array, anses ejeren af array'et for at være
ejeren af objektet.
- Hvis en funktion har til formål at oprette et objekt, bør dets navn starte
med "Create", og returværdien bør være objektet.
- Hvis a oprettes som en lokal variabel i en funktion/procedure, og ingen af
ovenstående regler gælder, er denne funktion som udgangspunkt ejer, og
objektet bør så også nedlægges i denne funktion/procedure.
- Benyt altid "FreeAndNil (a);" i stedet for "a.Free;". På denne måde får du
en invariant som er "objekter er altid nil eller peger på allokeret
memory". Det er yderst praktisk, især fordi både FreeAndNil() og .Free()
undlader at gøre noget, hvis variablen er nil i forvejen.
Det kan virke lidt irriterende at skulle holde styr på det, når man kommer
fra Java - til gengæld kommer belønningen ved deployment og hastighed.
Hilsen,
Lars.
--
Freelance programmør
Dybdahl Engineering:
http://dybdahl.dk/
Delphi brugergruppen DAPUG:
http://dapug.dk/
Rune Simonsen wrote:
> Jeg kommer fra Java og har lige et par hurtige om OOP i Delphi 6.
>
> Jeg har et objekt a som indeholder[1] en masse objekter af typen b og
> et objekt af typen b indeholder en masse objekter af typen c.
>
> De skal så free'es i Delphi. Er det nok at free'e a, eller skal jeg
> starte med at free'e alle c'er, så free'e alle b'er og så free'e a?
>
> Hvad er konsekvensen hvis alt ikke bliver free'et korrekt? "død"
> hukommelse, som ikke bliver frigivet antager jeg? Men bliver denne
> hukommelse frigivet når mit program afsluttes eller sker dette først
> efter genstart af maskinen?