Razumevanje in preprečevanje puščanja pomnilnika v Delfih

Delphipodpora objektno usmerjenega programiranja je bogata in močna. Razredi in predmeti omogočajo modularno programiranje kode. Skupaj z modularnejšimi in bolj zapletenimi komponentami pridejo bolj prefinjeni in bolj zapleteni hrošči.

Med razvojem aplikacije v Delphiju je (skoraj) vedno zabavno, obstajajo situacije, ko se vam zdi, da je ves svet proti vam.

Kadar koli morate v Delphiju uporabiti (ustvariti) predmet, morate sprostiti pomnilnik, ki ga je porabil (ko ga ne bo več treba). Zagotovo vam lahko bloki varovanja pomnilnika poskusi / končno pomagajo preprečiti uhajanje pomnilnika; še vedno ste odvisni od zaščite kode.

Popuščanje pomnilnika (ali virov) se pojavi, ko program izgubi sposobnost sproščanja pomnilnika, ki ga porabi. Ponavljajoče puščanje pomnilnika povzroči, da poraba pomnilnika procesa raste brez omejitev. Popuščanje pomnilnika je resna težava - če imate kodo, ki povzroča puščanje pomnilnika, v aplikaciji, ki se izvaja 24/7 bo aplikacija zapravila ves pomnilnik, ki je na voljo, in končno zaustavila odzivnost naprave.

instagram viewer

Popuščanje spomina v Delfih

Prvi korak k preprečevanju puščanja pomnilnika je razumevanje, kako se pojavijo. Sledi razprava o nekaterih običajnih pastih in najboljših praksah za pisanje nepropustne kode Delphi.

V večini (preprostih) aplikacij Delphi, kjer uporabljate komponente (Buttons, Memos, Edits itd.), Ki jih spustite na obrazec (v času načrtovanja), vam ni treba preveč skrbeti za upravljanje pomnilnika. Ko je komponenta postavljena na obrazec, oblika postane njegova lastnik in sprosti spomin, ki ga zasede komponenta, ko se obrazec zapre (uniči). Form je kot lastnik odgovoren za prenašanje pomnilnika komponent, ki jih je gostil. Skratka: sestavni deli obrazca se ustvarijo in uničijo samodejno

Primeri puščanja pomnilnika

V kateri koli nepomembni aplikaciji Delphi boste to želeli sprožiti komponente Delphi v času izvajanja. Imeli boste tudi nekaj lastnih razredov po meri. Recimo, da imate razred TDeveloper, ki ima metodo DoProgram. Zdaj, ko morate uporabiti razred TDeveloper, ustvarite primerek razreda s klicem Ustvari metoda (konstruktor). Metoda Create dodeli pomnilnik za nov predmet in vrne referenco na objekt.

var
zarko: TDeveloper
začeti
zarko: = TMyObject. Ustvari;
zarko. DoProgram;
konec;

In tukaj je preprosto puščanje spomina!

Kadar koli ustvarite predmet, morate odstraniti spomin, ki ga je zasedel. Če želite osvoboditi dodeljeni pomnilnik, morate poklicati prost metoda. Če želite biti popolnoma prepričani, uporabite tudi poskusni / končni blok:

var
zarko: TDeveloper
začeti
zarko: = TMyObject. Ustvari;
poskusi
zarko. DoProgram;
končno
zarko. Prost;
konec;
konec;

To je primer varne dodelitve pomnilnika in kode za posredovanje.

Nekaj ​​opozorilnih besed: Če želite dinamično sprožiti komponento Delphi in jo izrecno osvoboditi pozneje, vedno dodajte nič kot lastnika. Če tega ne storite, lahko povzročite nepotrebno tveganje, pa tudi težave z zmogljivostjo in vzdrževanjem kode.

Poleg ustvarjanja in uničevanja predmetov z metodami Create and Free morate biti zelo previdni tudi pri uporabi "zunanjih" (datotek, baz podatkov itd.) Virov.
Recimo, da morate delovati na neki besedilni datoteki. V zelo preprostem scenariju, kjer se metoda AssignFile uporablja za povezavo datoteke na disku z datoteko Ko končate z datoteko, morate poklicati CloseFile, da sprostite ročaj datoteke rabljen. Tu nimate izrecnega klica »Brezplačno«.

var
F: TextFile;
S: niz;
začeti
AssignFile (F, 'c: \ somefile.txt');
poskusi
Readln (F, S);
končno
Zapri datoteko (F);
konec;
konec;

Drug primer vključuje nalaganje zunanjih DLL-jev iz kode. Kadar koli uporabljate LoadLibrary, morate poklicati FreeLibrary:

var
dllHandle: THandle;
začeti
dllHandle: = Loadlibrary ('MojaLiblioteka. DLL ');
// naredite nekaj s to DLL
če je dllHandle <> 0, potem FreeLibrary (dllHandle);
konec;

Spomin pušča v .NET?

Čeprav zbiralec smeti (GC) z Delphi za .NET upravlja večino pomnilniških opravil, je v .NET aplikacijah mogoče puščati pomnilnik. Tukaj je razprava o članku GC v Delphiju za .NET.

Kako se boriti proti puščanju spomina

Poleg pisanja modularne kode, ki je varna v pomnilniku, je mogoče preprečiti uhajanje pomnilnika z uporabo nekaterih drugih orodij, ki so na voljo. Delphi Orodja za odpravljanje pomnilnika vam pomagajo ujeti aplikacijo Delphi napake kot so poškodba pomnilnika, uhajanje pomnilnika, napake pri razporeditvi pomnilnika, napake inicializacije spremenljivk, konflikti spremenljivke v definiciji, napake kazalca in drugo.

instagram story viewer