michaenh Skrevet 6. desember 2003 Del Skrevet 6. desember 2003 Hei.. Siden jeg er så godt i gang så kan jeg bombandere forumet med litt spørsmål.. 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
kilogram Skrevet 7. desember 2003 Del Skrevet 7. desember 2003 (endret) 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. 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 7. desember 2003 av kilogram Lenke til kommentar
michaenh Skrevet 7. desember 2003 Forfatter Del Skrevet 7. desember 2003 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... Vi prates mer vet du... Thanks mate.. mha Lenke til kommentar
ChrML Skrevet 1. mai 2004 Del Skrevet 1. mai 2004 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
Anbefalte innlegg
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 kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå