logo

Co je únik paměti? Jak se můžeme vyhnout?

K nevracení paměti dochází, když programátoři vytvoří paměť na hromadě a zapomenou ji odstranit.

Důsledkem úniku paměti je, že snižuje výkon počítače snížením množství dostupné paměti. Nakonec se v nejhorším případě může alokovat příliš mnoho dostupné paměti, celý systém nebo zařízení nebo jeho část přestane správně fungovat, aplikace selže nebo se systém výrazně zpomalí.



Úniky paměti jsou zvláště závažné problémy u programů, jako jsou démoni a servery, které ze své podstaty nikdy nekončí.

Příklad úniku paměti

Níže uvedený příklad ukazuje koncept úniku paměti.

připojení k databázi v jazyce Java

C








/* Function with memory leak */> #include> void> f()> {> >int>* ptr = (>int>*)>malloc>(>sizeof>(>int>));> >/* Do some work */> >/* Return without freeing ptr*/> >return>;> }>

>

>

Příčiny úniku paměti v C

  1. Když dynamicky alokovaná paměť není uvolněna voláním free, vede to k únikům paměti. Vždy se ujistěte, že pro každou dynamickou alokaci paměti pomocí malloc nebo calloc existuje odpovídající bezplatné volání.
  2. Když se ztratí stopa ukazatelů, které odkazují na přidělenou paměť, může se stát, že se paměť neuvolní. Proto sledujte všechny ukazatele a ujistěte se, že je uvolněna paměť.
  3. Když se program náhle ukončí a přidělená paměť není uvolněna nebo pokud jakákoli část kódu brání volání free, může dojít k úniku paměti.

Jak se vyhnout únikům paměti?

Aby se předešlo nevracení paměti, měla by být paměť přidělená na haldě vždy uvolněna, když již není potřeba.

Příklad: Program pro uvolnění paměti přidělené v haldě, aby se zabránilo úniku paměti

Níže uvedený program ukazuje uvolnění paměti přidělené v haldě, aby se zabránilo úniku paměti.

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>;> }>

>

>

Příklad: Program pro kontrolu, zda je paměť uvolněná nebo ne

Níže uvedený příklad ukazuje, jak zkontrolovat, zda je paměť přidělená na haldě uvolněna nebo ne.

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ýstup

Memory Freed>

Závěr

Závěrem lze říci, že k únikům paměti může dojít, když alokujeme paměť na haldě, ale zapomeneme ji uvolnit nebo uvolnit. Kvůli únikům paměti můžeme zaznamenat snížení výkonu a systém se stane nestabilním. Úniky paměti způsobují větší škody u dlouho běžících programů, jako jsou servery. Abychom se vyhnuli únikům paměti, musíme uvolnit dynamicky alokovanou paměť voláním funkcí jako free().