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
mandate un messaggio di posta elettronica a bertoƶƶi@ce.unipr.it