Memory leak
Memory leak (čítaj memorylik) je druh chyby v programovaní v jazykoch bez automatickej správy pamäte, pri ktorej dochádza k čiastočnému, prípadne úplnému spotrebovaniu voľnej pamäte bez toho, aby ju nejaký program mohol využiť. Vznikne, keď program alokuje blok pamäte a nedealokuje ho potom ako ho už nepotrebuje. Dôvodom býva chyba programátora, kedy zabudol alokovanú pamäť dealokovať alebo pri jej alokovaní neuložil referenciu na ňu. Riešením je použitie automatickej správy pamäte – garbage collectora alebo špeciálnych knižníc, ktoré pomáhajú ladiť kód.
Po prepisovačovi druhý najnepríjemnejší bug, pretože sa obťažne hľadá, najmä pri COM (alebo ActiveX) aplikáciách.
Príklad na vznik memory leak
[upraviť | upraviť zdroj]Tento príklad, napísaný v pseudokóde je spracovaný podľa anglickej stránky o memory leak.
Znázorňuje postup, ktorým môže v pamäti vzniknúť alokované miesto, ktoré sa ďalej nevyužije, teda memory leak.
Uvedený príklad je časťou programu na ovládanie výťahov. Táto časť programu sa spúšťa vždy, keď vo výťahu niekto stlačí tlačidlo s číslom poschodia. Blok (časť) programu:
- Ak je stlačené tlačidlo:
- | Alokuj časť pamäte, ktorá bude použitá na zapamätanie si čísla poschodia
- | Ulož číslo poschodia do alokovanej časti pamäte
- | Skontroluj, či sme na cieľovom poschodí
- | Ak áno, tak:
- | Ukonči program (Na tomto mieste program preskočí zvyšné riadky kódu a ukončí sa.
- Ďalej po celom bloku môže napríklad nasledovať podprogram na otváranie dverí)
- Ak nie, tak:
- | Počkaj, kým sa výťah zastaví
- | Choď na požadované poschodie (To, ktoré si pamätá z druhého riadku programu. Na tomto mieste sa výťah presúva)
- | Uvoľni pamäť na zapamätanie čísla poschodia (Program uvoľní pamäť, a keďže ďalšie riadky podprogram nemá, ukončí sa)
Uvedený podprogram obsahuje časť, ktorá spôsobuje vznik memory leak. Bežný algoritmus pohybu výťahu po poschodiach, vzhľadom na príklad, ktorý je uvedený vyššie, prebieha takto (tento postup memory leak nespôsobí):
- Človek nastúpi do výťahu
- Stlačí tlačidlo poschodia
- Tlačidlo sa uloží do pamäte (zapamätá sa) – riadok 3
- Výťah skontroluje poschodie a zistí, že sa musí presunúť – riadok 4 a 8
- Výťah sa presunie – riadok 9 a 10
- Pamäť sa uvoľní – Tlačidlo vo výťahu zhasne – riadok 11
- Program sa ukončí
- Človek vystúpi
Toto je bežný algoritmus práce programu, keď všetko prebehne správne. V tomto prípade memory leak nevzniká. Problém s pamäťou však môže vzniknúť v takomto (menej bežnom) prípade, keď po vstupe do výťahu človek stlačí tlačidlo poschodia, na ktorom sa výťah nachádza:
- Človek nastúpi do výťahu
- Stlačí tlačidlo poschodia
- Tlačidlo sa uloží do pamäte (zapamätá sa) – riadok 3
- Výťah skontroluje poschodie a zistí, že sa presunúť nemusí – riadok 4 a 5
- Program sa ukončí
- Človek vystúpi
Ako vidieť v druhom prípade sa pamäť neuvoľnila (nedealokovala). Reálne tento prípad nenastáva často, no napriek tomu, vždy, keď sa to stane, časť pamäte sa obsadí a už sa nikdy neuvoľní. V konečnom dôsledku to môže spôsobiť nefunkčnosť výťahu, keď nebude dostatok pamäte napríklad na zapamätanie si poschodia, alebo na otvorenie dverí. V taktomto prípade už môže pomôcť iba resetovanie programu (jeho ukončenie a znovuspustenie). Aj keď je toto len modelová situácia, rovnako v bežnom, reálnom, programe môže takýto prípad, keď sa pamäť neuvoľní, nastať veľmi zriedkavo, ale aj takéto, menej časté, alokácie pamäte môžu spôsobiť značné problémy, najmä, ak sa pracuje s veľkými blokmi dát.
Výrazné problémy môžu vzniknúť ak je takéto alokovanie volané v cykle.