Do puščanja pomnilnika pride, ko programerji ustvarijo pomnilnik na kupu in ga pozabijo izbrisati.
Posledica puščanja pomnilnika je, da zmanjša zmogljivost računalnika z zmanjšanjem količine razpoložljivega pomnilnika. Sčasoma se lahko v najslabšem primeru dodeli preveč razpoložljivega pomnilnika, celoten ali del sistema ali naprave preneha delovati pravilno, aplikacija ne uspe ali pa se sistem močno upočasni.
Puščanje pomnilnika je še posebej resna težava za programe, kot so demoni in strežniki, ki se po definiciji nikoli ne končajo.
Primer puščanja pomnilnika
Spodnji primer prikazuje koncept uhajanja pomnilnika.
dogovor o imenih java
C
/* Function with memory leak */> #include> void> f()> {> >int>* ptr = (>int>*)>malloc>(>sizeof>(>int>));> >/* Do some work */> >/* Return without freeing ptr*/> >return>;> }> |
>
>
Vzroki za puščanje pomnilnika v C
- Ko se dinamično dodeljeni pomnilnik ne sprosti s klicem free, pride do puščanja pomnilnika. Vedno zagotovite, da za vsako dinamično dodelitev pomnilnika z uporabo malloc ali calloc obstaja ustrezen brezplačen klic.
- Ko se izgubi sled kazalcev, ki se sklicujejo na dodeljeni pomnilnik, se lahko zgodi, da se pomnilnik ne sprosti. Zato spremljajte vse kazalce in zagotovite, da je pomnilnik sproščen.
- Ko se program nenadoma zaključi in dodeljeni pomnilnik ni sproščen ali če kateri koli del kode prepreči klic free, lahko pride do uhajanja pomnilnika.
Kako se izogniti puščanju spomina?
Da bi se izognili uhajanju pomnilnika, je treba pomnilnik, dodeljen kopici, vedno sprostiti, ko ni več potreben.
Primer: program za sprostitev pomnilnika, dodeljenega v kopici, da se prepreči uhajanje pomnilnika
Spodnji program prikazuje, da je pomnilnik, dodeljen v kopici, sproščen, da se prepreči uhajanje pomnilnika.
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>;> }> |
>
>
Primer: Program za preverjanje, ali je pomnilnik sproščen ali ne
Spodnji primer prikazuje, kako preveriti, ali je pomnilnik, dodeljen kopici, sproščen ali 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> |
>
>Izhod
Memory Freed>
Zaključek
Skratka, do uhajanja pomnilnika lahko pride, ko pomnilnik dodelimo na kopico, vendar ga pozabimo sprostiti ali sprostiti. Zaradi uhajanja pomnilnika lahko pride do poslabšanja delovanja in sistem postane nestabilen. Puščanje pomnilnika povzroči večjo škodo za dolgo delujoče programe, kot so strežniki. Da bi se izognili uhajanju pomnilnika, moramo sprostiti dinamično dodeljeni pomnilnik s klicanjem funkcij, kot je free().