1 / 13

Laboratorio di Linguaggi lezione VIII B: Puntatori e Pasticci

Università dell’Insubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso di Laurea in Informatica Anno Accademico 2006/07. Laboratorio di Linguaggi lezione VIII B: Puntatori e Pasticci. Marco Tarini. Puntatori : pasticci. memory leak (“falla di memoria”).

Download Presentation

Laboratorio di Linguaggi lezione VIII B: Puntatori e Pasticci

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Università dell’Insubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso di Laurea in Informatica Anno Accademico 2006/07 Laboratorio di Linguaggilezione VIII B: Puntatori e Pasticci Marco Tarini

  2. Puntatori: pasticci • memory leak (“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; } Manca la deallocazione! ( free(un_puntatore);) 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 M a r c o T a r i n i ‧ L a b o r a t o r i o d i L i n g u a g g i ‧ 2 0 0 6 / 0 7 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a

  3. Puntatori: pasticci • 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)); Manca la deallocazione! ( free(un_puntatore);) Anche qui, il puntatore "un_puntatore" è perso per sempre, econ 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 M a r c o T a r i n i ‧ L a b o r a t o r i o d i L i n g u a g g i ‧ 2 0 0 6 / 0 7 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a

  4. Puntatori: pasticci • un altro caso di memory leak ... 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);) Anche qui, il puntatore "un_puntatore" è perso per sempre, econ 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 M a r c o T a r i n i ‧ L a b o r a t o r i o d i L i n g u a g g i ‧ 2 0 0 6 / 0 7 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a

  5. Puntatori: pasticci • stale pointer(“puntatore andato a male”) /* 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 */ } la variabile x non sopravvive al termine della funzione! l'indirizzo di memoria &x non è più valido allora! M a r c o T a r i n i ‧ L a b o r a t o r i o d i L i n g u a g g i ‧ 2 0 0 6 / 0 7 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a

  6. Puntatori: pasticci • dereferenced NULL 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) M a r c o T a r i n i ‧ L a b o r a t o r i o d i L i n g u a g g i ‧ 2 0 0 6 / 0 7 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a

  7. Puntatori: pasticci chissà in che locazione verrà scritto quel dieci... • dangling pointers (puntatori penzolanti) int *punt ; * punt = 10; M a r c o T a r i n i ‧ L a b o r a t o r i o d i L i n g u a g g i ‧ 2 0 0 6 / 0 7 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a

  8. Puntatori: pasticci • overrun screw(indicizzare oltre i boundaries) int *punt = (int*) calloc(5,sizeof(int)); punt[5] = 10; chissà in che locazione verrà scritto quel dieci... M a r c o T a r i n i ‧ L a b o r a t o r i o d i L i n g u a g g i ‧ 2 0 0 6 / 0 7 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a

  9. Puntatori: pasticci • overrun screw(indicizzare oltre i boundaries) int punt[ 5 ]; punt[5] = 10; chissà in che locazione verrà scritto quel dieci... M a r c o T a r i n i ‧ L a b o r a t o r i o d i L i n g u a g g i ‧ 2 0 0 6 / 0 7 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a

  10. Puntatori: pasticci • "fandango on core"(andare con un puntatore oltre i boundaries) int *punt = (int*) malloc(sizeof(int)); * punt[5] = 10; * punt ++; * punt = 10; chissà in che locazione verrà scritto quel dieci... M a r c o T a r i n i ‧ L a b o r a t o r i o d i L i n g u a g g i ‧ 2 0 0 6 / 0 7 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a

  11. Puntatori: pasticci • uso dopo deallocazione int *punt = (int*) calloc(10,sizeof(int)); ... free(punt); * punt = 10; chissà in che locazione verrà scritto quel dieci... M a r c o T a r i n i ‧ L a b o r a t o r i o d i L i n g u a g g i ‧ 2 0 0 6 / 0 7 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a

  12. Puntatori: pasticci • altro errore comune ... /* 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 M a r c o T a r i n i ‧ L a b o r a t o r i o d i L i n g u a g g i ‧ 2 0 0 6 / 0 7 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a

  13. 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 M a r c o T a r i n i ‧ L a b o r a t o r i o d i L i n g u a g g i ‧ 2 0 0 6 / 0 7 ‧ U n i v e r s i t à d e l l ’ I n s u b r i a

More Related