Comment tester si un pointeur a déjà été alloué ?
Bonjour,
Je me suis apercu en utilisant valgrind pour combler mes fuites mémoires qu'il m'arrive de désallouer dans un tableau de pointeurs des cellules qui n'ont pas été encore allouées... Est-il possible de tester si un pointeur a déjà été alloué afin de mettre un test avant mon free ?
Merci de votre aide.
Re: Comment tester si un pointeur a déjà été alloué ?
Citation:
Envoyé par Kroll
Je me suis apercu en utilisant valgrind pour combler mes fuites mémoires qu'il m'arrive de désallouer dans un tableau de pointeurs des cellules qui n'ont pas été encore allouées... Est-il possible de tester si un pointeur a déjà été alloué afin de mettre un test avant mon free ?
Merci de votre aide.
L'usage courant est d'appeler free(p), puis de forcer p = NULL. On peut le faire en une ligne avec l'opérateur ',' :
Code:
free (p), p = NULL;
free(NULL) est défini. Il ne fait rien.
Evidemment, ça ne modifie pas les copies du pointeur (aliasing), qui continuent à avoir une valeur indéterminée. Il faut donc rester prudent.
Re: Comment tester si un pointeur a déjà été alloué ?
Citation:
Envoyé par Emmanuel Delahaye
free(NULL) est défini. Il ne fait rien.
Le problème à mon avis n'est pas le free ( NULL), mais plutôt le free d'un pointeur non initialisé qui, lui, pourrait amener beaucoup de problèmes :wink:
Re: Comment tester si un pointeur a déjà été alloué ?
Citation:
Envoyé par DavG
Citation:
Envoyé par Emmanuel Delahaye
free(NULL) est défini. Il ne fait rien.
Le problème à mon avis n'est pas le free ( NULL), mais plutôt le free d'un pointeur non initialisé qui, lui, pourrait amener beaucoup de problèmes
Oui, mais
Code:
1 2 3
|
free (p);
free (p); |
provoque aussi un comportement indéfini, même si le p est valide.
Rappel de quelques regles de bon sens :
http://emmanuel-delahaye.developpez.....htm#pointeurs
Re: Comment tester si un pointeur a déjà été alloué ?
Citation:
Envoyé par Emmanuel Delahaye
Oui, mais
Code:
1 2 3
|
free (p);
free (p); |
provoque aussi un comportement indéfini, même si le p est valide.
Rappel de quelques regles de bon sens :
Dans un fonction où tu libères les pointeurs avant de sortir tu n'as pas besoin de forcer à NULL les variables locales, ça rajoute simplement du code inutile pour rien ... le bon sens c'est avant tout savoir ce qu'on fait et pourquoi on le fait !
Re: Comment tester si un pointeur a déjà été alloué ?
Citation:
Envoyé par DavG
Citation:
Envoyé par Emmanuel Delahaye
Oui, mais
Code:
1 2 3
|
free (p);
free (p); |
provoque aussi un comportement indéfini, même si le p est valide.
Rappel de quelques regles de bon sens :
Dans un fonction où tu libères les pointeurs avant de sortir tu n'as pas besoin de forcer à NULL les variables locales, ça rajoute simplement du code inutile pour rien ... le bon sens c'est avant tout savoir ce qu'on fait et pourquoi on le fait !
forcer un pointeur à NULL est une sécurité. Libre à toi de ne pas le faire.
Re: Comment tester si un pointeur a déjà été alloué ?
Citation:
Envoyé par DavG
Citation:
Envoyé par Emmanuel Delahaye
Oui, mais
Code:
1 2 3
|
free (p);
free (p); |
provoque aussi un comportement indéfini, même si le p est valide.
Rappel de quelques regles de bon sens :
Dans un fonction où tu libères les pointeurs avant de sortir tu n'as pas besoin de forcer à NULL les variables locales, ça rajoute simplement du code inutile pour rien ... le bon sens c'est avant tout savoir ce qu'on fait et pourquoi on le fait !
Dans le cas trivial d'une variable locale, c'est assez simple, quoique la valeur du pointeur pourrait très bien être transmise à une autre fonction après libération, ce qui constitue un bug grave. Au moins, si on transmet NULL, il risque d'être detecté.
Re: Comment tester si un pointeur a déjà été alloué ?
Citation:
Envoyé par Yabo
forcer un pointeur à NULL est une sécurité. Libre à toi de ne pas le faire.
Ce n'est pas ce que j'ai dit : dans le cas d'une variable locale (qui n'est pas retournée par la fonction .. ) c'est inutile, donc il ne s'agit pas du tout d'une sécurité mais d'une habitude de programmation :wink:
Re: Comment tester si un pointeur a déjà été alloué ?
Citation:
Envoyé par DavG
Citation:
Envoyé par Yabo
forcer un pointeur à NULL est une sécurité. Libre à toi de ne pas le faire.
Ce n'est pas ce que j'ai dit : dans le cas d'une variable locale (qui n'est pas retournée par la fonction .. ) c'est inutile, donc il ne s'agit pas du tout d'une sécurité mais d'une habitude de programmation :wink:
Oui dans ce cas particulier, c'est comme ne pas mettre sizeof(char) quand on alloue un char* avec malloc. Certes ca ne sert à rien de le mettre (puisque ca vaut par définition 1) mais ce forcer à le faire nous fais prendre de bonnes habitudes ;)