Pochopiť a predchádzať únikom pamäte v Delphi

DelphiPodpora objektovo orientovaného programovania je bohatá a výkonná. Triedy a objekty umožňujú modulové programovanie kódu. Spolu s modulárnymi a zložitejšími komponentmi prichádzajú sofistikovanejšie a komplexnejšie hmyz.

Pri vývoji aplikácie v Delphi je (takmer) vždy zábavná, existujú situácie, keď máte pocit, že celý svet je proti vám.

Kedykoľvek potrebujete použiť (vytvoriť) objekt v Delphi, musíte uvoľniť pamäť, ktorú spotrebuje (keď už nepotrebujete). Bloky ochrany pamätí vyskúšať / nakoniec určite môžu pomôcť zabrániť úniku pamäte; Zabezpečenie kódu je stále na vás.

K úniku pamäte (alebo zdroja) dôjde, keď program stratí schopnosť uvoľniť pamäť, ktorú spotrebuje. Opakované úniky pamäte spôsobujú, že využitie pamäte v procese rastie bez hraníc. Únik pamäte predstavuje vážny problém - ak máte kód, ktorý spôsobuje únik pamäte, v spustenej aplikácii 24/7, aplikácia spotrebuje všetku dostupnú pamäť a nakoniec spôsobí, že stroj prestane reagovať.

Vynechanie pamäte v Delphi

Prvým krokom, ako sa vyhnúť úniku pamäte, je pochopiť, ako k nim dôjde. Nasleduje diskusia o niektorých bežných úskaliach a osvedčených postupoch pri písaní nezodpovedajúceho kódu Delphi.

instagram viewer

Vo väčšine (jednoduchých) aplikáciách Delphi, kde používate komponenty (tlačidlá, poznámky, úpravy atď.), Ktoré vložíte do formulára (v čase návrhu), sa nemusíte príliš starať o správu pamäte. Po vložení komponentu do formulára sa formulár stáva jeho vlastník Akonáhle je formulár zatvorený (zničený), uvoľní pamäť prijatú komponentom. Formulár ako vlastník je zodpovedný za dislokáciu komponentov, ktoré hostil, do pamäte. V skratke: komponenty vo formulári sa vytvoria a zničia automaticky

Príklady únikov pamäte

V akejkoľvek netriviálnej aplikácii Delphi budete chcieť vytvorte komponenty Delphi v čase spustenia. Budete mať tiež niektoré svoje vlastné triedy. Povedzme, že máte triedu TDeveloper, ktorá má metódu DoProgram. Teraz, keď potrebujete použiť triedu TDeveloper, vytvoríte inštanciu triedy volaním vytvoriť metóda (konštruktor). Metóda Create alokuje pamäť pre nový objekt a vracia odkaz na objekt.

var
zarko: TDeveloper
začať
zarko: = TMyObject. vytvorenie;
Zarko. DoProgram;
koniec;

A tu je jednoduchý únik pamäte!

Kedykoľvek vytvoríte objekt, musíte zlikvidovať pamäť, ktorú zaberá. Ak chcete uvoľniť pamäť pridelenému objektu, musíte zavolať zadarmo metóda. Aby ste si boli úplne istí, mali by ste použiť aj blok try / konečne:

var
zarko: TDeveloper
začať
zarko: = TMyObject. vytvorenie;
vyskúšať
Zarko. DoProgram;
konečne
Zarko. Zadarmo;
koniec;
koniec;

Toto je príklad bezpečného pridelenia pamäte a kódu deallocation.

Niekoľko slov s upozornením: Ak chcete dynamicky vytvoriť inštanciu Delphi komponenty a explicitne ju uvoľniť niekedy neskôr, vždy ako vlastník odovzdajte nulu. Ak tak neurobíte, môže to predstavovať zbytočné riziko, problémy s výkonom a údržbou kódu.

Okrem vytvárania a ničenia objektov pomocou metód Create and Free musíte byť veľmi opatrní aj pri používaní „externých“ zdrojov (súbory, databázy atď.).
Povedzme, že musíte pracovať s nejakým textovým súborom. Vo veľmi jednoduchom scenári, kde sa metóda AssignFile používa na priradenie súboru na disku k súboru Keď skončíte so súborom, musíte zavolať CloseFile, aby ste uvoľnili popisovač súboru použité. Na tomto mieste nemáte výslovný hovor „Bezplatne“.

var
F: TextFile;
S: reťazec;
začať
AssignFile (F, 'c: \ somefile.txt');
vyskúšať
Readln (F, S);
konečne
CloseFile (F);
koniec;
koniec;

Ďalším príkladom je načítanie externých knižníc DLL z vášho kódu. Kedykoľvek používate LoadLibrary, musíte zavolať FreeLibrary:

var
dllHandle: THandle;
začať
dllHandle: = Loadlibrary ('MyLibrary. DLL ');
// urobiť niečo s touto DLL
ak dllHandle <> 0, potom FreeLibrary (dllHandle);
koniec;

Únik pamäte v .NET?

Aj keď s programom Delphi for .NET riadi zberač odpadu (GC) väčšinu úloh týkajúcich sa pamäte, v aplikáciách .NET je možné mať úniky pamäte. Tu je diskusia o článku GC v Delphi pre .NET.

Ako bojovať proti únikom pamäte

Okrem písania modulárneho kódu bezpečného pre pamäť je možné zabrániť úniku pamäte pomocou niektorých dostupných nástrojov tretích strán. Delphi Nástroje na vynechanie pamäte pomôže chytiť aplikáciu Delphi chyby napríklad poškodenie pamäte, úniky pamäte, chyby pridelenia pamäte, chyby inicializácie premenných, konflikty definícií premenných, chyby ukazovateľov a ďalšie.

instagram story viewer