Si je affectait de manière dynamique un espace pour un pointeur, répertoriez ceci: Dois-je libérer un moment où le code est effectué? Merci! P> p>
4 Réponses :
Oui. Si vous avez bien quelque chose avec succès, quelque chose est correct de le libérer aussi.
int *a = (int *) malloc(sizeof int); if (a != NULL) { /* Do whatever you need to do with a */ free(a); } else { puts("the malloc function failed to allocate an int"); }
Il est sûr et bien défini à gratuit (null) code>.
ERR ..... Ce code ressemble plutôt à une inutile et la distribution n'est pas nécessaire.
Donc, pour une liste liée, comme nous savons que le premier nœud de la liste est vide, et nous devrions libérer le premier nœud à la fin du programme ??
@la météo. C'est vrai en C ++.
@Evilteach ... et en c
C17 § 7.22.3.3 si PTR code> est un pointeur NULL, aucune action ne se produit. I>
Je considère que je envisage que le code ici est vraiment inutile .... 1. libre (null); code> est un NOP de toute façon, 2. L'ensemble du code est inutile car la mémoire est libérée juste après Être alloué, le code n'est pas faux, c'est un mauvais exemple.
int *a = malloc(sizeof(*a)); if (a) { /* a is now valid; use it: */ *a = 1 + 2 + 3; printf("The value calculated is %d\n", *a); } /* Variable A is done being used; free the memory. */ free(a); /* If a failed to be allocated, it is NULL, and this call is safe. */
Je pense que vous avez un peu de malentendus liée au pointeur.
Votre titre dit: P>
Pointeur non initialisé gratuit ... P> blockQuote>
et votre code est p>
xxx pré> le problème avec ceci est qu'il y a pas de pointeur non inaicialisé fort> dans le code. Le seul pointeur du code est la variable
A code> et elle
est forte> initialisée par la valeur renvoyée par malloc code>. P>
liberté Un pointeur non initialisé serait mauvais - Exemple: p>
xxx pré> mais que vous initialisez réellement le pointeur, vous devez appeler gratuitement lorsque vous êtes effectué à l'aide du pointeur d'objet / mémoire < Code> a code> points à. Peu importe que l'objet pointu à un objet (aka mémoire) a été attribué une valeur. P>
La règle générale: Pour chaque appel de
Malloc code> Il doit y avoir un appel de
libres code> p>
(exception: si votre programme se termine, vous n'avez pas besoin d'appeler
gratuit code>) p> p> p> P>
free(a);
L'espace pour le pointeur n'est pas alloué de manière dynamique, le
int code> qu'il pointe de l'est. Lorsque le code est terminé, vous devez libérer avec
gratuit (a); code>.
1. Ne pas lancer
malloc code>. 2. C'est une bonne pratique pour libérer la mémoire allouée et est toujours recommandée, mais ce n'est pas nécessaire si vous utilisez le pointeur jusqu'à la fin absolue du programme.
Règle de la règle: tout ce qui a été alloué par
MALLOC / calloc / realloc / code> doit être libéré avec
gratuit code> à un moment donné.
Je pense que j'ai votre question maintenant.
A code> n'est pas ininitialisé ici. Mais le
int code> pointé i> par
A code> est ininitialisé. Oui, vous devez libérer
A code> un point.
@Jabberwocky: également
STRUP code>,
asprintf code> et
VASPRINTF code>. Peut-être d'autres?
Pourquoi vous ne devriez pas lancer un malloc: Stackoverflow.com/Questtions/605845/...
@Abelenky correct, mais
asprintf code> est une extension GCC et
STRUP code> est POSIX.
ATTENTION: la valeur transmise à
GRATUITE code> doit être exactement la même i> comme on a été obtenue à partir de
MALLOC code>, pas une autre qui a été, par exemple, incrémentée. La valeur B> est sa seule identité, jusqu'à ce que
gratuit code> est concerné.