punteros puntero operadores operaciones matrices lenguaje direccion con cadenas aritmetica c pointers

operadores - punteros void lenguaje c



liberando un puntero nulo (7)

¿Qué sucede dentro de la memoria si tratamos de liberar un puntero que apunta a NULL? ¿Es eso alguna vez válido?

¿Por qué no muestra ningún mensaje de advertencia / error?


Qué sucede dentro de la memoria si tratamos de liberar un puntero que apunta a NULL. es eso alguna vez valido?

Nada.

¿por qué no muestra ningún mensaje de advertencia / error?

En primer lugar, el comportamiento es válido por definición, por lo que no es necesario emitir ningún error o advertencia.

En segundo lugar, un puntero apunta a NULL en tiempo de ejecución. ¿Cómo debería mostrarse un mensaje de advertencia o error, si es que aparece? Imagina que estás jugando a un juego llamado Kill the Zombie y mientras dos de estos seres te están atacando, aparece un mensaje de error emergente que dice: "Advertencia, puntero NULL liberado".


liberar el puntero nulo no tendrá ningún efecto en la ejecución.



Desde C99, sección 7.20.3.2: la función gratuita

Sinopsis

1 #include <stdlib.h> void free(void *ptr);

Descripción

2 La función gratuita hace que el espacio apuntado por ptr sea desasignado, es decir, esté disponible para una asignación posterior. Si ptr es un puntero nulo, no se produce ninguna acción .


Hace mucho tiempo, hubo implementaciones de ''free ()'' que se bloquearon cuando se les dio un puntero nulo a free. Esto solo se aplica a las implementaciones anteriores a la norma C89 (C90) que no se han modificado para tratar el problema desde entonces.

En mi experiencia, esencialmente no hay ninguna de esas implementaciones (ni debería haber), por lo que ahora es seguro liberar punteros nulos.

Si tiene algún requisito para realizar un puerto a sistemas extremadamente extraños y antiguos, entonces tal vez deba ser cauteloso. Por otro lado, si tuviera que preocuparse de tales sistemas, probablemente sabría sobre el tema (y una gran cantidad de otros problemas), o habría algún conocimiento común en torno al código que lo indique.


Podría ser seguro (no lo sabía, pero las otras respuestas parecen sugerir eso), pero no caeré en el hábito de no preocuparme si el puntero ya es nulo. La asignación p = NULL; después de cada libre pronto sigue como un corolario. Esto es peligroso en aplicaciones multiproceso, ya que después de esta asignación, p podría ser utilizado por otro hilo y sería liberado nuevamente por el hilo actual mientras se espera que esté vivo por los otros hilos.

Toda memoria mallocida debería ser liberada una vez. Período.


Yo iría por:

#ifdef MY_DOUBTS_HAUNT_ME_IN_MY_DREAMS #define safe_free(x) do { if ((x)) free((x)); } while(0) #elseif /* feeling gutsy */ #define safe_free(x) free((x)) #endif

; - ||