01: // esempio memory leak
02: #include<stdio.h>
03: #include<stdlib.h>
04: 
05: 
06: int main(int argc, char **argv){
07: 
08:   unsigned int n;
09:   int *myarr;      // per gestire array di interi allocato dinamicamente
10:   int sum;
11: 
12:   while(1)
13:   {
14:     printf("Quanti interi vuoi sommare (0 per terminare)? ");
15:     scanf("%u", &n);
16: 
17:     if(!n)
18:       break;
19: 
20:     myarr = malloc(sizeof(int) * n); // alloco array per memorizzare quanto leggero' da tastiera
21:     if(!myarr)
22:     {
23:       printf("Non sono riuscito ad allocare quanto richiesto! Esco...\n");
24:       exit(1); // termina il programma
25:     }
26: 
27:     printf("Solo per debug ti dico che hai allocato il buffer all'indirizzo %p\n", myarr);
28: 
29:     // prima li leggo
30:     for(int i = 0; i < n; ++i)
31:     {
32:       printf("Inserisci numero intero: ");
33:       scanf("%d", &myarr[i]);
34:     }
35: 
36:     // poi li sommo (potevo fare senza memorizzarli ma questo e' un esempio)
37:     sum = 0;
38:     for(int i = 0; i < n; ++i)
39:       sum += myarr[i];
40: 
41:     printf("Il totale vale: %d\n", sum);
42: 
43:     // il codice funziona da un punto di vista pratico (o, per essere piu' precisi, funziona inizialmente)
44:     // pero' ad ogni ciclo ripeto una malloc(). Ogni volta viene riservata un'area di memoria
45:     // MAI piu' liberata. 
46:     // Quando ripeto la malloc() l'indirizzo di questa area di memoria lo perdiamo
47:     // Non solo non riusciamo piu' ad accedervi ma neanche la possiamo liberare
48:     // MEMORY LEAK
49:     // Ripetendo il tutto, io rischio di esaurire la memoria.
50:   }
51: 
52: 
53: 
54:   return 0;
55: }
56: 
57: 


Se avete commenti o osservaƶioni su questa pagina
mandate un messaggio di posta elettronica a bertoƶƶi@ce.unipr.it