logo

Kas yra atminties nutekėjimas? Kaip galime išvengti?

Atminties nutekėjimas įvyksta, kai programuotojai sukuria atmintį krūvoje ir pamiršta ją ištrinti.

Atminties nutekėjimo pasekmė yra ta, kad dėl to sumažėja kompiuterio našumas, nes sumažėja laisvos atminties kiekis. Galų gale, blogiausiu atveju, gali būti skirta per daug laisvos atminties, visa arba dalis sistemos ar įrenginio nustoja tinkamai veikti, programa sugenda arba sistema labai sulėtėja.



Atminties nutekėjimas yra ypač rimta problema tokioms programoms kaip demonai ir serveriai, kurie pagal apibrėžimą niekada nesibaigia.

Atminties nutekėjimo pavyzdys

Toliau pateiktame pavyzdyje parodyta atminties nutekėjimo koncepcija.

homogeniškas mišinys

C








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

>

>

Atminties nutekėjimo priežastys C

  1. Kai dinamiškai paskirstyta atmintis neatlaisvinama skambinant nemokamai, tai sukelia atminties nutekėjimą. Visada įsitikinkite, kad kiekvienam dinaminiam atminties paskirstymui naudojant malloc arba calloc yra atitinkamas nemokamas skambutis.
  2. Kai prarandamos nuorodos, nukreipiančios į skirtą atmintį, gali atsitikti taip, kad atmintis nebus atlaisvinta. Taigi sekite visas nuorodas ir įsitikinkite, kad atlaisvinama atmintis.
  3. Kai programa staiga nutrūksta ir skirta atmintis neatlaisvinama arba jei kuri nors kodo dalis neleidžia iškviesti laisvos vietos, gali atsirasti atminties nutekėjimo.

Kaip išvengti atminties nutekėjimo?

Kad būtų išvengta atminties nutekėjimo, krūvoje skirta atmintis visada turėtų būti atlaisvinta, kai jos nebereikia.

Pavyzdys: programa, skirta atlaisvinti krūvoje skirtą atmintį, kad būtų išvengta atminties nutekėjimo

Toliau pateikta programa rodo, kad krūvoje skirta atmintis yra atlaisvinta, kad būtų išvengta atminties nutekėjimo.

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

>

>

Pavyzdys: programa, skirta patikrinti, ar atmintis atlaisvinta, ar ne

Toliau pateiktame pavyzdyje parodyta, kaip patikrinti, ar krūvoje skirta atmintis yra atlaisvinta, ar 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>

>

>

Išvestis

Memory Freed>

Išvada

Apibendrinant galima pasakyti, kad atminties nutekėjimas gali įvykti, kai paskirstome atmintį krūvoje, bet pamirštame ją išleisti arba atlaisvinti. Dėl atminties nutekėjimo gali pablogėti našumas ir sistema taps nestabili. Atminties nutekėjimas sukelia daugiau žalos ilgai veikiančioms programoms, pvz., serveriams. Norėdami išvengti atminties nutekėjimo, turime atlaisvinti dinamiškai paskirstytą atmintį iškviesdami tokias funkcijas kaip free ().