2012-05-23 16 views
5

El código es el siguiente:¿Puedo liberar() variables estáticas y automáticas en C?

#include <stdlib.h> 

int num = 3; // Static external variable 
int *ptr = &num; 

int main(void) 
{ 
int num2 = 4; // Automatic variable 
int *ptr2 = &num2; 

free(ptr); //Free static variable 
free(ptr2); //Free automatic variable 

return 0; 
} 

intento compilar el código anterior y funciona, tengo curiosidad que hace la función free() capaz de liberar tanto la variable estática y también variable automática? O básicamente no hace nada?

+1

"Funciona" para una definición de "trabajos" con una calidad suficientemente baja. También puede bloquearse, incluso en el mismo sistema, el mismo compilador o diferentes opciones de compilación. Es simplemente ** un comportamiento indefinido **: cualquier cosa puede suceder, incluso algo esperado. – Jens

Respuesta

12

Calling free() en un puntero no devuelto por la asignación de memoria funciones (malloc, calloc etc) provoca un comportamiento indefinido .
Su código tiene un comportamiento indefinido, lo que el compilador no necesita darle cualquier diagnóstico de la misma y esto puede mostrar cualquier comportamiento, que podría funcionar, o un accidente, o literalmente hacer nada.

Evita a la escritura de código que provoca un comportamiento indefinido es la única solución.

+0

También puede llamar a free() en un puntero NULL, ya que ese es un comportamiento definido. Solo asegúrate de nunca llamar a free() dos veces en el puntero * same *. –

+0

¿Cómo trato de liberar dos veces? – caramel1995

+0

@ caramel23: Todo lo que puede obtener la garantía es un Comportamiento Indefinido. –

5

No deberías hacer eso. free solo se utiliza para la memoria asignada dinámicamente desde el montón por malloc familia de funciones.

memoria para num se asigna estáticamente en el segmento de datos y no puede ser liberado. La memoria para num2 se asigna en el marco de la pila de llamadas main y se lanzará tan pronto como regrese main.

¿Qué sucede realmente depende de la implementación de free. Por lo general, se mantienen estructuras de datos específicas en heap para ayudar a malloc/free a rastrear las áreas de memoria asignadas y libres. free espera que estas estructuras de datos estén en algún lugar alrededor del lugar al que apunta su argumento. Al pasarle un puntero que no apunta a un área de montón asignada de malloc, considerará los datos basura como información útil y hará cosas extrañas. Y tienes suerte si el resultado es solo un bloqueo inmediato del programa.

Cuestiones relacionadas