[Delphi] Wat wel en niet in een destructor?

Pagina: 1
Acties:

  • PostbodeSiemen
  • Registratie: Maart 2000
  • Laatst online: 19-08-2024
Wat voor een dingen moet je nu wel en niet in een destructor afbreken?
Arrays, objecten, variabelen. ...... ?

v.b.
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Type
   TDataCollectie = class
   private
      dataArray: array of TData;
   public
      destructor destroy;
      function addData(data: TData): boolean ;
      function getData(nummer: integer):  TData;
      function getSize(): integer;
   end;

   myCollectie := TDataCollectie.create;
   ......
   ......
   myCollectie.destroy;

Wat moet er nu gedaan worden als de destroy van myCollectie wordt aangeroepen?
Moet ik elke entry in de array vrijgeven met free?
Moet ik elke referentie in de array op nul zetten met := nil?
Moet ik de array zelf weggooien (ik zou eerlijk gezegd niet weten hoe)

  • JapJap
  • Registratie: Maart 2001
  • Laatst online: 07-01 11:02
Alle objecten die je maakt in een klasse moet je ook weer vrijgeven. Dit kan je doen in de destructor van de klasse. Persoonlijk geef ik in de destructor alleen de objecten vrij die in in de constructor heb aangemaakt. Alle andere objecten geef ik vrij zodra deze niet meer gebruikt worden.

In plaats van het gebruik van een array zou je eens kunnen kijken naar een TObjectList: TObjectList controls the memory of its objects, freeing an object when its index is reassigned; when it is removed from the list with the Delete, Remove, or Clear method; or when the TObjectList instance is itself destroyed.

  • PostbodeSiemen
  • Registratie: Maart 2000
  • Laatst online: 19-08-2024
OK, TObjectList , daar ga ik eens naar kijken.
Zijn van die dingen waar je niet altijd even snel achter komt als je niet gewent bent in Delphi te proggen.

Dus als ik een Object heb dat 3 objecten bezit welke allen ook weer een paar objecten bezitten moet met de aanroep van destroy/free op het hoofdobject die hele boom ingegaan worden om alles te verwijderen.

En als ik daarintegen alleen het hoofdobject verwijder en er staat in zijn destructor niks, dan blijft er dus een klomp geheugen hangen.

  • JapJap
  • Registratie: Maart 2001
  • Laatst online: 07-01 11:02
Dus als ik een Object heb dat 3 objecten bezit welke allen ook weer een paar objecten bezitten moet met de aanroep van destroy/free op het hoofdobject die hele boom ingegaan worden om alles te verwijderen.

En als ik daarintegen alleen het hoofdobject verwijder en er staat in zijn destructor niks, dan blijft er dus een klomp geheugen hangen.
Jij snapt 't ;)

  • Tomatoman
  • Registratie: November 2000
  • Laatst online: 13:23

Tomatoman

Fulltime prutser

PostbodeSiemen schreef op 31 juli 2002 @ 15:08:
Dus als ik een Object heb dat 3 objecten bezit welke allen ook weer een paar objecten bezitten moet met de aanroep van destroy/free op het hoofdobject die hele boom ingegaan worden om alles te verwijderen.
Een object mag je nooit met Destroy opruimen, daar gebruik je altijd Free voor. Free roept dan de destructor aan, maar geeft geen exceptions wanneer het object niet bestaat (dus nil is).
code:
1
2
3
4
5
6
7
8
with TEenOfAnderObject.Create do
try
  DoeDit;
  DoeDat;
finally
  Free;   { NIET Destroy! Free geeft geen problemen als Create
            faalt, Destroy zou een exception genereren. }
end;

Een goede grap mag vrienden kosten.


  • PostbodeSiemen
  • Registratie: Maart 2000
  • Laatst online: 19-08-2024
Dat van free zat ik net te lezen ja. Nog nooit problemen gehad met destroy, maar dat is waarschijnlijk meer geluk dan wijsheid.
(of een verdomd goed design :+)

  • Monga
  • Registratie: Mei 2002
  • Laatst online: 09:51
Als je componenten maakt met (private) array's en objecten, kan je het beste in de destructor aan alle objecten na het Free'en nog nil assignen (tip: FreeAndNil ;)), en alle array's (na alle entries te hebben gefreed) met
code:
1
Pointer(array) := nil
ook 'nillen'.

Wil nog wel eens wat excepties bij het sluiten van forms die die componenten bevatten oplossen... :(

Verwijderd

misschien een rare vraag postbode siemen maar mag ik de "add"functie eens zien.
Niet dat ik je kan helpen(eerder visa versa), ik ben benieuwd hoe je dat doet.

  • PostbodeSiemen
  • Registratie: Maart 2000
  • Laatst online: 19-08-2024
Tot nu toe had ik de volgende code:

code:
1
2
3
4
5
6
   function addData(data: TData): boolean ;
   begin
      setlength(dataArray, length(dataArray)+1);
      dataArray[length(dataArray)-1] := data;
      result := true;
   end;


Eigenlijk doelloos dat het een functie is maar ik ga misschien nog een keer een foutafhandeling inbouwen. Aan de andere kant zit het ontwerp zo in elkaar dat er geen fout kan optreden.

Verwijderd

dank u
Pagina: 1