logo

Cos'è la perdita di memoria? Come possiamo evitare?

Una perdita di memoria si verifica quando i programmatori creano una memoria in un heap e dimenticano di eliminarla.

La conseguenza della perdita di memoria è che riduce le prestazioni del computer riducendo la quantità di memoria disponibile. Alla fine, nel peggiore dei casi, potrebbe essere allocata una quantità eccessiva di memoria disponibile, tutto o parte del sistema o del dispositivo smetterebbe di funzionare correttamente, l'applicazione non funzionerebbe o il sistema rallenterebbe notevolmente.



Le perdite di memoria sono problemi particolarmente seri per programmi come demoni e server che, per definizione, non terminano mai.

Esempio di perdita di memoria

L'esempio seguente mostra il concetto di perdita di memoria.

metodo sottostringa in Java

C








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

>

>

Cause di perdite di memoria in C

  1. Quando la memoria allocata dinamicamente non viene liberata chiamando free, si verificano perdite di memoria. Assicurati sempre che per ogni allocazione di memoria dinamica utilizzando malloc o calloc, ci sia una chiamata gratuita corrispondente.
  2. Quando si perde la traccia dei puntatori che fanno riferimento alla memoria allocata, è possibile che la memoria non venga liberata. Quindi tieni traccia di tutti i puntatori e assicurati che la memoria venga liberata.
  3. Quando il programma termina bruscamente e la memoria allocata non viene liberata o se qualsiasi parte del codice impedisce la chiamata di free, potrebbero verificarsi perdite di memoria.

Come evitare perdite di memoria?

Per evitare perdite di memoria, la memoria allocata nell'heap deve essere sempre liberata quando non è più necessaria.

Esempio: programma per rilasciare la memoria allocata nell'heap per evitare perdite di memoria

Il programma seguente mostra che la memoria allocata nell'heap viene rilasciata per evitare perdite di memoria.

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

>

>

Esempio: programma per verificare se la memoria è liberata o meno

L'esempio seguente mostra come verificare se la memoria allocata sull'heap è liberata o meno.

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>

>

>

Produzione

Memory Freed>

Conclusione

In conclusione, possono verificarsi perdite di memoria quando allochiamo memoria sull'heap ma dimentichiamo di rilasciarla o liberarla. A causa di perdite di memoria, potremmo riscontrare un degrado delle prestazioni e il sistema diventa instabile. Le perdite di memoria causano più danni ai programmi di lunga durata come i server. Per evitare perdite di memoria dobbiamo liberare la memoria allocata dinamicamente chiamando funzioni come free().