Forstå og forhindre minnelekkasjer i Delphi

DelphiStøtten til objektorientert programmering er rik og kraftig. Klasser og objekter muliggjør modulær kodeprogrammering. Sammen med mer modulære og mer komplekse komponenter kommer mer sofistikerte og mer komplekse bugs.

Mens du utvikler applikasjoner i Delphi er (nesten) alltid morsomt, det er situasjoner der du føler at hele verden er mot deg.

Hver gang du trenger å bruke (opprette) et objekt i Delphi, må du frigjøre minnet det forbrukte (en gang ikke lenger var nødvendig). Sikkert, kan prøve / endelig minnevernblokker hjelpe deg med å forhindre lekkasjer i minnet; Det er fremdeles opp til deg å beskytte koden din.

Et minne (eller ressurs) lekkasje oppstår når programmet mister muligheten til å frigjøre minnet det bruker. Gjentatte minnelekkasjer får minnebruken til en prosess til å vokse uten grenser. Minnelekkasjer er et alvorlig problem - hvis du har en kode som forårsaker minnelekkasje, i et program som kjører 24/7 vil applikasjonen spise opp alt tilgjengelig minne og til slutt få maskinen til å slutte å svare.

instagram viewer

Memory Lekkasjer i Delphi

Det første trinnet for å unngå minnelekkasjer er å forstå hvordan de oppstår. Det som følger er en diskusjon om noen vanlige fallgruver og beste fremgangsmåter for å skrive Delphi-kode som ikke er lekker.

I de fleste (enkle) Delphi-applikasjoner, der du bruker komponentene (knapper, memoer, redigeringer, etc.) du slipper på et skjema (på designtidspunktet), trenger du ikke bry deg for mye om minnestyring. Når komponenten er plassert på et skjema, blir skjemaet dets Eieren og vil frigjøre minnet som er tatt av komponenten når skjemaet er lukket (ødelagt). Form, som eier, er ansvarlig for minnetildeling av komponentene det vert. Kort sagt: komponenter på et skjema opprettes og ødelegges automatisk

Eksempler på minnelekkasjer

I alle ikke-trivielle Delphi-applikasjoner vil du ønske det øyeblikkelig Delphi-komponenter ved kjøretid. Du vil også ha noen av dine egne tilpassede klasser. La oss si at du har en klasse TDeveloper som har en metode DoProgram. Når du nå trenger å bruke TDeveloper-klassen, oppretter du en forekomst av klassen ved å ringe til Skape metode (konstruktør). Opprett-metoden tildeler minne for et nytt objekt og returnerer en referanse til objektet.

Var
zarko: TDeveloper
begynne
zarko: = TMyObject. Skape;
Zarko. DoProgram;
slutt;

Og her er en enkel minnelekkasje!

Hver gang du oppretter et objekt, må du avhende minnet det okkuperte. For å frigjøre minnet til et objekt som er tildelt, må du ringe til Gratis metode. For å være helt sikker, bør du også bruke try / endelig blokkering:

Var
zarko: TDeveloper
begynne
zarko: = TMyObject. Skape;
prøve
Zarko. DoProgram;
endelig
Zarko. Gratis;
slutt;
slutt;

Dette er et eksempel på sikker minnetildeling og deallokasjonskode.

Noen advarselord: Hvis du ønsker å dynamisere en Delphi-komponent dynamisk og eksplisitt frigjøre den en gang senere, må du alltid gi deg null som eier. Unnlatelse av dette kan føre til unødvendig risiko, i tillegg til problemer med ytelse og kode.

I tillegg til å opprette og ødelegge objekter ved hjelp av Create and Free-metodene, må du også være veldig forsiktig når du bruker "eksterne" (filer, databaser osv.) Ressurser.
La oss si at du må operere på en tekstfil. I et veldig enkelt scenario, der AssignFile-metoden brukes til å knytte en fil på en disk til en fil variabel når du er ferdig med filen, må du ringe CloseFile for å frigjøre filhåndtaket til å begynne brukt. Det er her du ikke har en eksplisitt oppfordring til "Gratis".

Var
F: TextFile;
S: streng;
begynne
AssignFile (F, 'c: \ somefile.txt');
prøve
Readln (F, S);
endelig
CloseFile (F);
slutt;
slutt;

Et annet eksempel inkluderer lasting av eksterne DLL-er fra koden din. Hver gang du bruker LoadLibrary, må du ringe FreeLibrary:

Var
dllHandle: THandle;
begynne
dllHandle: = Loadlibrary ('MyLibrary. DLL ');
// gjøre noe med denne DLL
hvis dllHandle <> 0, da FreeLibrary (dllHandle);
slutt;

Minne lekker i .NET?

Selv om søppeloppsamleren (GC) administrerer de fleste minneoppgaver hos Delphi for .NET, er det mulig å ha minnelekkasjer i .NET-applikasjoner. Her er en artikkeldiskusjon GC i Delphi for .NET.

Slik kjemper du mot minnelekkasjer

I tillegg til å skrive modulær minnesikker kode, kan du forhindre minnelekkasjer ved å bruke noen av de tilgjengelige tredjepartsverktøyene. Delphi Memory Leak Fix Tools hjelper deg med å fange Delphi-applikasjonen feil for eksempel hukommelseskorrupsjon, minnelekkasjer, hukommelsesallokasjonsfeil, variabel initialiseringsfeil, variabel definisjonskonflikter, pekerfeil og mer.

instagram story viewer