Atmiņas noplūde rodas, kad programmētāji izveido atmiņu kaudzē un aizmirst to izdzēst.
Atmiņas noplūdes sekas ir tādas, ka tā samazina datora veiktspēju, samazinot pieejamās atmiņas apjomu. Galu galā, sliktākajā gadījumā, var tikt piešķirts pārāk daudz pieejamās atmiņas, visa sistēma vai ierīce vai tās daļa pārstāj darboties pareizi, lietojumprogramma atteicas vai sistēma ievērojami palēninās.
Atmiņas noplūde ir īpaši nopietna problēma tādām programmām kā dēmoni un serveri, kas pēc definīcijas nekad nebeidzas.
Atmiņas noplūdes piemērs
Tālāk esošajā piemērā parādīta atmiņas noplūdes koncepcija.
virkne līdz garai
C
/* Function with memory leak */> #include> void> f()> {> >int>* ptr = (>int>*)>malloc>(>sizeof>(>int>));> >/* Do some work */> >/* Return without freeing ptr*/> >return>;> }> |
>
>
Atmiņas noplūdes cēloņi C
- Ja dinamiski piešķirtā atmiņa netiek atbrīvota, zvanot bez maksas, tas noved pie atmiņas noplūdes. Vienmēr pārliecinieties, ka katrai dinamiskai atmiņas piešķiršanai, izmantojot malloc vai calloc, ir atbilstošs bezmaksas zvans.
- Ja tiek zaudēta norāžu izseka, kas norāda uz piešķirto atmiņu, var gadīties, ka atmiņa netiek atbrīvota. Tāpēc sekojiet līdzi visiem rādītājiem un pārliecinieties, ka atmiņa tiek atbrīvota.
- Ja programma pēkšņi tiek pārtraukta un piešķirtā atmiņa netiek atbrīvota vai ja kāda koda daļa neļauj izsaukt brīvu, var rasties atmiņas noplūde.
Kā izvairīties no atmiņas noplūdēm?
Lai izvairītos no atmiņas noplūdes, kaudzē atvēlētā atmiņa vienmēr ir jāatbrīvo, kad tā vairs nav nepieciešama.
Piemērs: programma kaudzē piešķirtās atmiņas atbrīvošanai, lai izvairītos no atmiņas noplūdes
Tālāk redzamā programma parāda, ka kaudzē atvēlētā atmiņa ir atbrīvota, lai izvairītos no atmiņas noplūdes.
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>;> }> |
>
>
Piemērs: programma, lai pārbaudītu, vai atmiņa ir atbrīvota vai nav
Tālāk sniegtajā piemērā ir parādīts, kā pārbaudīt, vai kaudzē atvēlētā atmiņa ir atbrīvota.
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> |
>
>Izvade
Memory Freed>
Secinājums
Noslēgumā jāsaka, ka atmiņas noplūde var rasties, ja mēs piešķiram atmiņu kaudzītei, bet aizmirstam to atbrīvot vai atbrīvot. Atmiņas noplūdes dēļ var pasliktināties veiktspēja un sistēma kļūst nestabila. Atmiņas noplūde rada lielāku kaitējumu ilgstoši darbojošām programmām, piemēram, serveriem. Lai izvairītos no atmiņas noplūdēm, mums ir jāatbrīvo dinamiski piešķirtā atmiņa, izsaucot tādas funkcijas kā free ().