¿Libera (ptr) donde ptr es memoria corrupta NULL?

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?

7.20.3.2 La función free

Sinopsis

 #include  void free(void *ptr); 

Descripción

La función free hace que el espacio apuntado por ptr sea ​​desasignado, es decir, que esté disponible para una asignación posterior. Si ptr 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.

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 progtwigción defensiva recomiendan:

 if (ptr != NULL) free(ptr); 

Si ptr es NULL, no se realiza ninguna operación.

dice la documentación.

Recuerdo haber trabajado en PalmOS donde se bloqueó free(NULL) .

 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.

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(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) 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 progtwig 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.