tarjeta - ¿Libera(ptr) donde ptr es memoria corrupta NULL?
tarjeta sd dañada android no reconoce (10)
7.20.3.2 La función
free
Sinopsis
#include <stdlib.h> void free(void *ptr);
Descripción
La función
free
hace que el espacio apuntado porptr
sea desasignado, es decir, que esté disponible para una asignación posterior. Siptr
es un puntero nulo, no se produce ninguna acción.
Ver ISO-IEC 9899 .
Dicho esto, al observar diferentes bases de código en la naturaleza, notará que las personas a veces lo hacen:
if (ptr)
free(ptr);
Esto se debe a que algunos tiempos de ejecución de C (estoy seguro de que fue el caso en PalmOS) se bloquean al liberar un puntero NULL
.
Pero hoy en día, creo que es seguro suponer que free(NULL)
es un nop según las instrucciones de la norma.
Teóricamente puedo decir que
free(ptr);
free(ptr);
es una corrupción de memoria ya que estamos liberando la memoria que ya ha sido liberada.
Pero que si
free(ptr);
ptr=NULL;
free(ptr);
Como el sistema operativo se comportará de manera indefinida, no puedo obtener un análisis teórico real sobre lo que está sucediendo. Lo que sea que esté haciendo, ¿esta memoria es corrupta o no?
¿Liberar un puntero NULL es válido?
Si ptr es NULL, no se realiza ninguna operación.
dice la documentación.
Recuerdo haber trabajado en PalmOS donde se bloqueó free(NULL)
.
Todas las versiones compatibles con los estándares de la biblioteca C tratan gratis (NULL) como no operativas.
Dicho esto, en un momento hubo algunas versiones gratuitas que se bloquearían gratis (NULL) y es por eso que tal vez veas que algunas técnicas de programación defensiva recomiendan:
if (ptr != NULL)
free(ptr);
Uso recomendado:
free(ptr);
ptr = NULL;
Ver:
man free
The free() function deallocates the memory allocation pointed to by ptr.
If ptr is a NULL pointer, no operation is performed.
Cuando establece el puntero en NULL
después de free()
, puede volver a llamar a free()
y no se realizará ninguna operación.
free (ptr) se guarda en C si ptr es NULL, sin embargo, lo que la mayoría de la gente no sabe es que NULL no tiene por qué ser igual a 0. Tengo un bonito ejemplo de la vieja escuela: en el C64, en la dirección 0, hay es un IO-Port. Si escribió un programa en C que accede a este puerto, necesitaría un puntero cuyo valor sea 0. La biblioteca en c correspondiente debería distinguir entre 0 y NULL.
Saludos cordiales
no corrupción de memoria, pero el comportamiento depende de la implementación. Por estándar, debería ser un código legal.
ptr apunta hacia alguna ubicación de memoria, digamos 0x100.
Cuando libera (ptr), básicamente está permitiendo que el administrador de memoria utilice 0x100 para ser utilizado para otra actividad o proceso y en palabras simples es la desasignación de recursos.
Cuando haces ptr = NULL, estás haciendo ptr point a una nueva ubicación (no nos preocupemos por qué es NULL). Al hacerlo, perdió la pista de los datos de la memoria 0x100. Esto es lo que es pérdida de memoria.
Por lo tanto, no es aconsejable usar ptr = NULL en un ptr válido.
En cambio, podrías hacer un control seguro usando:
if (ptr! = NULL) {free (ptr);}
Cuando libera (ptr) donde ptr ya está apuntando a NULL, no realiza ninguna operación. Por lo tanto, es seguro hacerlo.
free(NULL)
es perfectamente legal en C, así como delete (void *)0
y delete[] (void *)0
son legales en C ++.
Por cierto, liberar memoria dos veces generalmente causa algún tipo de error de tiempo de ejecución, por lo que no corrompe nada.
free(ptr);
ptr=NULL;
free(ptr);/*This is perfectly safe */
Puede eliminar de forma segura un puntero NULL. No se realizará ninguna operación en ese caso. En otras palabras, free () no hace nada en un puntero NULL.