2010-07-29 2 views
7

Possible en double:
Setting variable to NULL after free …Est-il toujours recommandé de définir des pointeurs sur NULL après les avoir libérés()?

J'apprends sur les pratiques de programmation bonne C et mon ami m'a dit de toujours définir les pointeurs NULL après libre() les (ou suivant l'appel d'une fonction de libération spécifique).

Par exemple:

char* ptr = malloc(100); 
... 
free(ptr); 
ptr = NULL; 

ou

struct graph* graph = create_graph(); 
... 
destroy_graph(graph); 
graph = NULL; 

Pourquoi est-ce une bonne pratique?

Mise à jour: Après avoir lu les réponses, cela me semble une pratique horrible! Je cache des erreurs possibles de double-free(). Comment cela peut-il être une bonne pratique? Je suis choqué.

Merci, Boda Cydo.

+0

@bodacydo Jetez un oeil aux questions "connexes" sur la droite de la page. –

+0

Merci Neil et Michael. Cette question répond vraiment à ma question. Après avoir lu les réponses, j'ai une autre question: ne pas mettre le pointeur sur NULL cache-t-il des erreurs? Les doubles gratuits() ne sont plus détectés! Je suis maintenant confus car cela cache vraiment des erreurs de se montrer. – bodacydo

+1

Comment ça? Libérer un pointeur et le définir sur NULL permet de libérer la mémoire. Si vous décidez alors de libérer NULL, vous devriez obtenir un assert ou un autre avertissement.La double libération de mémoire est beaucoup plus difficile à suivre que la libération de NULL. –

Répondre

2

Mauvaise pratique vote de ma part. Si vous souhaitez attribuer une valeur, définissez-le à (void *) 0xdeadbeef. Vérifiez ce que votre CRT peut faire en premier. Un allocateur de débogage décent définira la mémoire libérée à un modèle qui est susceptible de provoquer une bombe lorsque le pointeur est utilisé après qu'il a été libéré. Bien que ce ne soit pas garanti. Mais alors pas changer la valeur du pointeur est la meilleure solution (et plus rapide).

-5

Je pense que oui ...

Lorsque vous avez fini d'utiliser une partie de menory, nous devrions patchage libre() permet à la mémoire libérée à utiliser pour d'autres fins ... comme plus malloc () appels.

libre prend un pointeur vers la mémoire comme argument et libère la mémoire à laquelle le pointeur se réfère à ...

Hope this helps ... :)

+5

-1: Cela ne répond pas à la question. bodacydo ne demandait pas, devrait-il la mémoire libre. Il demandait, devrait-il mettre les pointeurs à NULL après l'avoir libéré. –

6

Ceci est considéré comme une bonne pratique par certains parce que cela vous empêche d'accéder accidentellement à la mémoire après qu'elle a été libre() ed.

+1

Après avoir lu les réponses, j'ai trouvé que c'était une mauvaise pratique - je cache des erreurs de double-gratuit! Comment cela peut-il être une bonne pratique? – bodacydo

+1

En fait, cela ne vous empêche pas automatiquement d'y accéder, mais vous pouvez (et devriez) toujours vérifier les pointeurs NULL, mais vous ne pouvez pas dire si un pointeur non-NULL est valide. Par conséquent, c'est une bonne pratique. – cypheon

+0

Je ne suis pas encore convaincu que c'est une bonne pratique. – bodacydo

13

Bien que cela ne puisse pas nuire, cela n'aide pas toujours. Le problème à prendre en compte est qu'il est facile d'avoir plusieurs copies du pointeur et il est fort probable que vous n'allez en définir qu'une seule à NULL. L'exemple classique où il ne permet pas du tout est:

void free_graph(graph *g) 
{ 
    ... 
    free(g); 
    g = NULL; // not useful in this context 
} 

Le problème ici est que vous définissez uniquement le pointeur qui est local à free_graph NULL et le pointeur est détenu par l'appelant de free_graph vous toujours avoir sa valeur originale.

Questions connexes