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