Dinglende pointer
En dinglende pointer , i programmeringssprog , angiver en pointer, der refererer til et hukommelsesområde, der ikke længere er gyldigt, fordi det allerede er blevet frigivet, eller fordi markøren bruges uden for konteksten af eksistensen af den variabel, som den refererer til. Da operativsystemet kan gentildele og genbruge denne hukommelsesplacering, medfører brugen af en dinglende pointer uforudsigelige effekter, lige fra segmenteringsfejl (UNIX-systemer) eller generel beskyttelsesfejl (Windows-systemer), med deraf følgende afslutning af den applikation, der forårsagede fejlen, på grund af korruption af data i hukommelsen. [1]
Nogle årsager til dinglende pointer
I programmeringssprog som f.eks. C , som kræver, at programmøren sørger for at frigøre den dynamisk allokerede hukommelse, vil pointere, ligesom alle andre variabler, fortsat indeholde den sidste værdi, der er tildelt dem, selv når denne værdi ikke er, er den mere gyldig . Når f.eks. hukommelsen, der peges på af en bestemt markør, frigøres, kan den ikke længere bruges uden at gentildele den til et andet hukommelsesområde.
Et eksempel er vist nedenfor:
int * i = ( int * ) malloc ( størrelse på ( int ));
/ * ... * /
fri ( i );
* i = 200 ; / * på dette tidspunkt henviser værdien indeholdt i i ikke længere * til et gyldigt hukommelsesområde! * /
En anden årsag til dinglende pointere, som tidligere nævnt, kan være brugen af en pointer, der refererer til en variabel uden for konteksten af eksistensen (eller omfanget) af sidstnævnte.
For eksempel:
int * i = NULL ;
{
int kont = 3 ;
i = & forts ;
/ * ... * /
* i = 2 ; / * svarer til at skrive cont = 2; * /
}
* i = 200 ; / * på dette tidspunkt er cont ikke længere en gyldig variabel, * så i refererer ikke længere til et gyldigt hukommelsesområde! * /
Et sidste eksempel viser en anden fejl (faktisk meget lig den forrige), der ofte forårsager problemer med hængende pointere, det vil sige at vende tilbage til slutningen af en funktion, adressen på en lokal variabel, der ikke længere er gyldig uden for selve funktionen:
int * returnerer UnInt ()
{
int kont = 3 ;
returnere & forts ; / * markøren til forts er ikke gyldig uden for denne funktion! * /
}
Noter
- ^ Harvey M. Deitel, Paul J. Deitel, C ++. Fundamentals of programmering , Apogeo, 2005.
- ^ Paolo Santi, grundlæggende programmering i C: pointers , på wwwold.iit.cnr.it , 22. december 2014. Hentet kl. 12:45 .