2010-08-02 3 views
4

Normalement, si un pointeur est libéré deux fois, c'est un double gratuit. Par exemple,Est-ce un double gratuit en C?

char *ptr; 
ptr=malloc(5 * sizeof(*ptr)); 
free(ptr); 
free(ptr); 

Le code ci-dessus est considéré comme étant sans double. Est-ce que ce qui suit est également considéré comme double gratuit?

char *ptr; 
char *ptr1; 
ptr=malloc(5 * sizeof(*ptr)); 
ptr1=ptr; 
free(ptr); 
free(ptr1); 

Merci.

+0

Le deuxième exemple a le pointeur dangling –

Répondre

10

Oui. La bibliothèque ne se soucie pas du nom que vous avez donné dans votre code source (il est long passé lorsque le code a été exécuté). Tout ce qui compte est la valeur, et dans ce cas, les valeurs passées à free() seraient les mêmes.

10

Oui. Vous libérez le même souvenir deux fois.

+0

(Qui peut causer quelques erreurs méchantes et plantage) –

0

Oui. Un double gratuit est lorsque vous essayez de libérer un bloc de mémoire qui a déjà été libéré. Comme ptr et ptr1 pointent sur le même bloc de mémoire, le second appel à free tente de libérer un bloc de mémoire déjà libéré.

0

Oui, car les pointeurs pointent tous deux vers la même adresse et transmettent ainsi la même adresse.

Vous pouvez montrer ce que la valeur du pointeur est en l'imprimant

printf("%p", ptr); 

ou de regarder dans un débogueur

0

Oui, c'est un double libre (et une très mauvaise chose à faire) . Le ptr1 est un pointeur sur la mémoire allouée par le malloc. C'est le même endroit que pointer vers. En libérant ptr et ptr1, vous libérez deux fois le même souvenir.