libérer un pointeur null
Ce qui se passe à l'intérieur de la mémoire si nous essayons de libérer un pointeur qui pointe vers NULL?
Est-ce que jamais valide?
Pourquoi ne pas afficher les messages d'avertissement/erreur?
- de rien, ...encore, le comportement de la libération d'un pointeur non null tout ce qui n'est pas malloc avais précédemment est pas défini et il est généralement désastreux.
- Les pointeurs ne sont pas "pointant vers NULL". Les pointeurs sont ou ne sont pas null eux-mêmes. "Pointeur qui pointe vers NULL" est un non-sens d'instruction.
- si un pointeur est de stocker l'adresse d'une varibale,c'est une pratique habituelle qu'un programmeur va dire pointeur vers cette variable.il n'est donc pas absurde de tresorerie.peut-être que je me trompe.mais il ne me semble pas non sensiques déclaration.
- Lorsqu'un pointeur est null, il n'est pas "stockage de l'adresse NULL". NULL n'a pas d'adresse. Lorsqu'un pointeur est null, il n'est tout simplement pas pointer n'importe où.
- Cette question est un double de la stackoverflow.com/questions/1912325/...
Vous devez vous connecter pour publier un commentaire.
De C99 section 7.20.3.2 : Le gratuit fonction
Synopsis
Description
De http://linux.die.net/man/3/malloc:
NULL
et "valeur de pointeur null". Plus graves et/ou des documents officiels sont normalement assez pointilleux à ce sujet (voir les autres réponses).Once upon a très, très longtemps, il y avait des implémentations de " free()' qui s'est écrasé lors d'une de pointeur null gratuit. Cela s'applique uniquement à des implémentations avant la date de la C89 (C90) standard qui n'ont pas été modifiés pour traiter le problème depuis.
Dans mon expérience, il n'y a essentiellement aucune de ces implémentations de gauche (et ne doit pas être), de sorte qu'il est maintenant libre de pointeurs null.
Si vous avez des exigences, du port, très bizarre et anciens systèmes, alors peut-être que vous devriez toujours être prudent. D'autre part, si vous avez eu ces systèmes à s'inquiéter, que vous auriez probablement savoir à propos de la question (et de toute une série d'autres questions) - ou il y aurait quelques communal de connaissances dans le code qui indique ce.
J'irais pour:
;-||
free(NULL)
est parfaitement légal. Il n'y a pas de point à vérifier pourNULL
avantfree
ing-il.Rien.
Tout d'abord, le comportement est valide par définition, donc pas d'erreur ou d'avertissement doit être émis.
Deuxième, un pointeur pointe vers NULL au moment de l'exécution. Comment un avertissement ou un message d'erreur sera affiché, si? Imaginez que vous jouez à un jeu appelé Tuer le Zombie et tandis que deux de ces êtres qui vous attaquent, une fenêtre de message d'erreur apparaît, en disant: "Attention, pointeur NULL libérés."
Il pourrait être sûr (je ne le savais pas, mais les autres réponses semblent suggérer que), mais je ne vais pas tomber dans l'habitude de ne pas se soucier de savoir si le pointeur est déjà nulle. L'affectation
p = NULL;
après tout s'est très tôt comme un corollaire. C'est dangereux dans les applications multithread, après cette affectation,p
peut être utilisé par un autre thread et serait libéré à nouveau par le thread courant alors qu'il est prévu d'être en vie par les autres threads.Chaque malloc avais mémoire doit être libéré une fois. Période.