Únik pamäte nastáva, keď programátori vytvoria pamäť v hromade a zabudnú ju vymazať.
Dôsledkom úniku pamäte je, že znižuje výkon počítača znížením množstva dostupnej pamäte. V najhoršom prípade sa môže prideliť príliš veľa dostupnej pamäte, celý systém alebo zariadenie alebo jeho časť prestane správne fungovať, aplikácia zlyhá alebo sa systém výrazne spomalí.
Úniky pamäte sú obzvlášť závažným problémom pre programy, ako sú démoni a servery, ktoré podľa definície nikdy neskončia.
Príklad úniku pamäte
Nasledujúci príklad ukazuje koncept úniku pamäte.
pripojenie k databáze v jazyku Java
C
/* Function with memory leak */> #include> void> f()> {> >int>* ptr = (>int>*)>malloc>(>sizeof>(>int>));> >/* Do some work */> >/* Return without freeing ptr*/> >return>;> }> |
>
>
Príčiny úniku pamäte v C
- Keď dynamicky alokovaná pamäť nie je uvoľnená volaním free, vedie to k úniku pamäte. Vždy sa uistite, že pre každú dynamickú alokáciu pamäte pomocou malloc alebo calloc existuje zodpovedajúce bezplatné volanie.
- Keď sa stratí stopa ukazovateľov, ktoré odkazujú na pridelenú pamäť, môže sa stať, že sa pamäť neuvoľní. Preto sledujte všetky ukazovatele a uistite sa, že sa uvoľní pamäť.
- Keď sa program náhle ukončí a pridelená pamäť sa neuvoľní alebo ak niektorá časť kódu bráni volaniu free, môže dôjsť k úniku pamäte.
Ako sa vyhnúť únikom pamäte?
Aby sa predišlo úniku pamäte, pamäť alokovaná na halde by sa mala vždy uvoľniť, keď už nie je potrebná.
Príklad: Program na uvoľnenie pamäte pridelenej v halde, aby sa zabránilo úniku pamäte
Nižšie uvedený program zobrazuje uvoľnenie pamäte pridelenej v halde, aby sa zabránilo úniku pamäte.
C
/* Function without memory leak */> #include> void> f()> {> >int>* ptr = (>int>*)>malloc>(>sizeof>(>int>));> >/* Do some work */> >/* Memory allocated by malloc is released */> >free>(ptr);> >return>;> }> |
>
>
Príklad: Program na kontrolu, či je pamäť voľná alebo nie
Nasledujúci príklad ukazuje, ako skontrolovať, či je pamäť alokovaná na halde uvoľnená alebo nie.
C
// C Program to check whether the memory is> // freed or not> #include> #include> int> main(>void>)> {> >int>* ptr;> >ptr = (>int>*)>malloc>(>sizeof>(>int>));> >if> (ptr == NULL)> >printf>(>'Memory Is Insuffficient
'>);> >else> {> >free>(ptr);> >printf>(>'Memory Freed
'>);> >}> }> // This code is contributed by sarajadhav12052009> |
>
>Výkon
Memory Freed>
Záver
Záverom možno povedať, že k úniku pamäte môže dôjsť, keď pridelíme pamäť na haldu, ale zabudneme ju uvoľniť alebo uvoľniť. V dôsledku úniku pamäte môžeme zaznamenať zníženie výkonu a systém sa stane nestabilným. Úniky pamäte spôsobujú väčšie škody pre dlho spustené programy, ako sú servery. Aby sme sa vyhli úniku pamäte, musíme uvoľniť dynamicky alokovanú pamäť volaním funkcií ako free().