Laboratorio di Linguaggi Puntatori e Pasticci Puntatori: pasticci
Transcript
Laboratorio di Linguaggi Puntatori e Pasticci Puntatori: pasticci
Università dell’Insubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso di Laurea in Informatica Puntatori: pasticci • memory leak Anno Accademico 2007/08 (“falla di memoria”) int una_funzione () { int *un_puntatore; /* alloco un vettore di 100 interi */ un_puntatore = (int*)calloc( 100, sizeof(int)); /* uso il vettore */ ... /* fine della funzione */ return 0; } Laboratorio di Linguaggi lezione VIII B: Puntatori e Pasticci Manca la deallocazione! ( free(un_puntatore); ) Marco Tarini All'uscita della funzione il puntatore "un_puntatore" è perso per sempre, e con lui la possibilità di liberare ("sprenotare", per così dire) la memoria. Ogni volta che si accede a questa funzione, si perdono (leak) 100x4 bytes di memoria Marco Tarini - Laboratorio di Linguaggi - 2007/08 - Università dell’Insubria Puntatori: pasticci Puntatori: pasticci • un altro caso di memory leak • un altro caso di memory leak ... int *un_puntatore; /* alloco un vettore di 100 interi */ un_puntatore = (int*)calloc( 100, sizeof(int)); /* uso il vettore */ ... /* rialloco un altro vettore */ un_puntatore = (int*)calloc( 100, sizeof(int)); ... int *un_puntatore, i; /* alloco un vettore di 100 interi */ un_puntatore = (int*)calloc( 100, sizeof(int)); /* uso il vettore */ ... /* rialloco un altro vettore */ un_puntatore = &i; Manca la deallocazione! ( free(un_puntatore); ) Manca la deallocazione! ( free(un_puntatore); ) Anche qui, il puntatore "un_puntatore" è perso per sempre, e con lui la possibilità di liberare ("sprenotare", per così dire) la memoria. Ogni volta che si accede a questa funzione, si perdono (leak) 100x4 bytes di memoria Anche qui, il puntatore "un_puntatore" è perso per sempre, e con lui la possibilità di liberare ("sprenotare", per così dire) la memoria. Ogni volta che si accede a questa funzione, si perdono (leak) 100x4 bytes di memoria Marco Tarini - Laboratorio di Linguaggi - 2007/08 - Università dell’Insubria Marco Tarini - Laboratorio di Linguaggi - Puntatori: pasticci Puntatori: pasticci • stale pointer (“puntatore andato a male”) • dereferenced NULL /* funzione che restituisce un puntatore ad un intero */ int* una_funzione () { int *punt; int x=10; ... return &x; /* restituisci il puntatore che punta alla variabile x */ } 2007/08 - Università dell’Insubria int *punt = NULL; * punt = 10; Errore, ma nessun disastro, il sistema se ne accorge in run time (hopefully)... L’esecuzione terimina (con un segmentation fault) la variabile x non sopravvive al termine della funzione! l'indirizzo di memoria &x non è più valido allora! Marco Tarini - Laboratorio di Linguaggi - 2007/08 - Università dell’Insubria Marco Tarini - Laboratorio di Linguaggi - 2007/08 - Università dell’Insubria 1 Puntatori: pasticci • dangling pointers Puntatori: pasticci (puntatori penzolanti) int *punt ; * punt = 10; • overrun screw (indicizzare oltre i boundaries) int *punt = (int*) calloc(5,sizeof(int)); punt[5] = 10; chissà in che locazione verrà scritto quel dieci... Marco Tarini - Laboratorio di Linguaggi - 2007/08 chissà in che locazione verrà scritto quel dieci... - Università dell’Insubria Marco Tarini - Laboratorio di Linguaggi - Puntatori: pasticci Puntatori: pasticci • overrun screw • "fandango on core" (indicizzare oltre i boundaries) - Università dell’Insubria (andare con un puntatore oltre i boundaries) int *punt = (int*) malloc(sizeof(int)); * punt punt[5] ++;= 10; * punt = 10; int punt[ 5 ]; punt[5] = 10; chissà in che locazione verrà scritto quel dieci... Marco Tarini - Laboratorio di Linguaggi - 2007/08 2007/08 chissà in che locazione verrà scritto quel dieci... - Università dell’Insubria Marco Tarini - Laboratorio di Linguaggi - Puntatori: pasticci Puntatori: pasticci • uso dopo deallocazione • altro errore ... int *punt = (int*) calloc(10,sizeof(int)); ... free(punt); * punt = 10; chissà in che locazione verrà scritto quel dieci... 2007/08 - Università dell’Insubria /* funzione che restituisce un puntatore ad un intero */ int* una_funzione () { int x; x=10; ... free( &x ); /* libera la memoria usata da x (?) */ } le variabili allocate staticamente (in maniera automatica) vengono anche disallocate automaticamente alla fine del blocco! regola d’oro: free va usato solo con i puntatori restituiti da malloc / calloc Marco Tarini - Laboratorio di Linguaggi - 2007/08 - Università dell’Insubria Marco Tarini - Laboratorio di Linguaggi - 2007/08 - Università dell’Insubria 2 Puntatori: pasticci • altro errore comune : aliasing bug ... int *x, *y; /* alloco px */ x= (int*) malloc(sizeof(int)); /* assegno y = x. Ora x e y puntano allo stesso blocco di memoria */ y = x; /* uso x */ ... /* libero x */ free( x ); /* uso y */ *y = 10; medicina: meglio usare un solo puntatore per ogni blocco di memoria allocato Marco Tarini - Laboratorio di Linguaggi - 2007/08 - Università dell’Insubria 3