Gå til innhold

Opprette og frigjøre objekter


Anbefalte innlegg

Hei..

 

Siden jeg er så godt i gang så kan jeg bombandere forumet med litt spørsmål.. :D

 

Hva er forskjellen med:

- create(nil) og create(application)..

Hva med:

- FreeAndNil(obj) og obj.free..

Hva med:

- obj := TADOQuery.create(nil)

 

Har disse noe å si med minne allokerings størrelse?

 

Takk..

 

mvh,

mha

Lenke til kommentar
Videoannonse
Annonse

Hva er forskjellen med:

- create(nil) og create(application)..

 

Create() tar som oftast ein parameter, AOwner. Som oftast går det heilt fint å lage eit objekt eller ein komponent uten ein eigar, men då MÅ du huske å frigjere objektet sjølv (med .Free eller FreeAndNil()). Dersom du sett ein eigar, vil eigarobjektet vere ansvarlig for å frigjøre objektet du har laga, og du slepp å gjere det sjølv (du kan gjere det om du vil).

 

Det er forresten berre klassar som nedarvar frå TComponent som har dette parameteret til .Create, andre klassar kan vere uten parameter, eller ha mange.

 

Hva med:

- FreeAndNil(obj) og obj.free..

 

Denne er meir subtil, og mange legger ikkje merke til den med ein gong. Sett at du har ein variabel som peikar til eit objekt.

 

var 
 MinVariabel: TStringList;
begin
 MinVariabel := TStringList.Create();
 // gjer ting med lista
 MinVariabel.Free;
end;

 

Her vil koden, når den er ferdig å køyre, framdeles ha MinVariabel som ein peikar til det den trur er ei StringList; den vil innehalde ei minneaddresse. Dersom du brukar FreeAndNil i staden, er det det samme som å kalle .Free, og deretter "MinVariabel := nil;". Det er difor ofte lurt å venne seg til å benytte FreeAndNil() i staden for .Free.

 

Edit: Dette er viktig dersom du i etterkant skal sjekke om objektet finns; Assigned(MinVariabel) i dømet over vil gje sann, dvs. at du ikkje kan sjekke om det er noko objekt gøymt i variabelen, og du kan forsøke å sjekke antall linjer i lista, berre for å få ein AV.

 

var 
 MinVariabel: TStringList;
 B: Integer;
begin
 MinVariabel := TStringList.Create();
 // gjer ting med lista
 MinVariabel.Free;

 if Assigned(MinVariabel) then
   B := MinVariabel.Count; // Forsøk å hente ut talet på linjer i lista
end;

 

Hadde du brukt FreeAndNil i staden, vil Assigned(MinVariabel) returnere false/usann, og difor vil den ikkje prøve å hente ut verdien til ein eigenskap som ikkje finns.

 

Hva med:

- obj := TADOQuery.create(nil)

 

No har ikkje eg brukt TADOQuery nokon gong, men den tar bare AOwner som parameter. Eg skjønner ikkje heilt kva du vil fram til her?

 

Edit: No trur eg eg skjønner. For å forklare, du lager eit objekt av typen TADOQuery, og og du legg (ein peikar til) objektet i variabelen "obj".

 

Har disse noe å si med minne allokerings størrelse?

 

På ein måte ja, og på ein måte nei. Først og fremst, du er nødt til å lage ein instans av klassen du skal bruke. Dette kan du sammenlikne med at det ikkje er nok å seie kva eigenskapar ein bil har, har du ikkje ein bil, så kan du ikkje bruke ein bil. :xmas: Når du opprettar eit objekt (med .Create), så vil det bruke minne, og det minnet den treng vil bli automatisk allokert.

 

Dersom du gløymer å frigjere objekt, får du det me kallar ein minnelekasje, og det skjønner sikkert du og at er A Bad Thing . Om du er interessert i emnet, så finns det mange program som lar deg oppdage minnelekasjar, det trengs berre litt googling på det. :)

Endret av kilogram
Lenke til kommentar

Flott Kilogram.

 

Skal ta en titt på det ettervhert.. takk..

Grunnen til at jeg spør disse spørsmålene er fordi programmet som er blitt utviklet er litt stor i minne størrelse.. jeg vet at det ikke er bra med minne lekkasjer..

 

Jeg for ta og google litt jeg da.. hehe... :D

Vi prates mer vet du...

 

Thanks mate..

 

mha

Lenke til kommentar
  • 4 måneder senere...

var

myvar: TMyType;

begin

myvar := TMyType.Create;

//here we use it

FreeAndNil(myvar);

end;

 

Lønner seg å bruke FreeAndNil, fordi den sjekker at du ikke prøver å freee ett object som allerede er destroya, og den setter også pointeren til Nil, som gjør at du kan sjekke om den eksisterer seinere med:

 

if myvar <> nil then

//eksisterer

else

//eksistere ikke

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...