Foros del Web » Programación para mayores de 30 ;) » C/C++ »

[SOLUCIONADO] Free vs NULL

Estas en el tema de Free vs NULL en el foro de C/C++ en Foros del Web. Hola, tengo una duda respecto a la funcion "free" y sobre asignar NULL a un puntero ¿Cuando se hace cada cual? y ¿Cual es la ...
  #1 (permalink)  
Antiguo 17/05/2013, 21:21
 
Fecha de Ingreso: septiembre-2011
Mensajes: 42
Antigüedad: 12 años, 7 meses
Puntos: 3
Free vs NULL

Hola, tengo una duda respecto a la funcion "free" y sobre asignar NULL a un puntero ¿Cuando se hace cada cual? y ¿Cual es la diferencia?.

Por ejemplo, estoy definiendo mi arbol binario...

Código C:
Ver original
  1. typedef int tipoElem;
  2.  
  3. typedef struct nodo{
  4.         tipoElem info;
  5.         struct nodo *izq;
  6.         struct nodo *der;
  7. }tNodo;
  8.  
  9. typedef struct{
  10.         tNodo *raiz;
  11.         int nElems;
  12. }tABB;
  13.  
  14. // inicializa un ABB como vacío
  15. void initTree (tABB *T){
  16.      T->raiz = NULL;
  17.      T->nElems = 0;
  18. }
  19.  
  20. // elimina todos los elementos de un ABB T, dejándolo vacío
  21. void clearHelp (tNodo *nodo){
  22.      if (nodo == NULL) return;
  23.      clearHelp(nodo->izq);
  24.      clearHelp(nodo->der);
  25.      free((void *)nodo);
  26. }
  27. void clear (tABB *T){
  28.      clearHelp(T->raiz);
  29.      T->raiz = NULL;
  30.      T->nElems = 0;

Seria lo mismo si en la funcion clear, en vez de usar free, a cada nodo asignarle NULL?

Gracias de antemano.
Saludos!
__________________
"Porque nada se...
quiero saberlo todo"
  #2 (permalink)  
Antiguo 18/05/2013, 02:28
 
Fecha de Ingreso: agosto-2012
Mensajes: 601
Antigüedad: 11 años, 8 meses
Puntos: 83
Respuesta: Free vs NULL

NULL es un valor nulo; free es una funcion que libera la memoria bloqueada por malloc (o realloc). Cuando declaras una variable por defecto se le asigna los datos que hay en el bloque de memoria que le corresponde (es decir que puede que no sea nulo): para asegurarnos de que es nulo le asignamos nulo manualmente para que despues se puedan hacer las comprovaciones de seguridad

Código:
tipo_dato *dato;//esto por si solo puede que no sea nulo

if(dato != NULL) {//aquí falla la comprovacion
    operacion_con_dato(dato);//y aqui revienta la aplicacion
}
Esto suele usarse en racks de datos: intentas generar una lista de datos y ante cualquier fallo llamas a una funcion que los libera todos, pero si aplicas 'free' sobre algo que no ha bloqueado tu aplicacion se produce un error, para eso se inicializa a nulo antes de hacer nada, y al final de todo cuando has terminado de trabajar y en el caso que la variable sea reutilizable se libera con 'free' y tambien se asigna nulo para evitar esos problemas.

Saludos
vosk
  #3 (permalink)  
Antiguo 18/05/2013, 02:30
 
Fecha de Ingreso: agosto-2012
Mensajes: 601
Antigüedad: 11 años, 8 meses
Puntos: 83
Respuesta: Free vs NULL

"...Seria lo mismo si en la funcion clear, en vez de usar free, a cada nodo asignarle NULL?..."

No; no daria error y el pc no estallaria (actualmente toda la memoria bloqueada por las aplicaciones se libera al finalizar), pero mientras no finalizaras esa informacion estaría disponible.

Saludos
vosk
  #4 (permalink)  
Antiguo 18/05/2013, 02:42
 
Fecha de Ingreso: julio-2012
Mensajes: 375
Antigüedad: 11 años, 9 meses
Puntos: 28
Respuesta: Free vs NULL

free libera la memoria utilizada, poner el puntero a NULL solo cambia donde apunta el puntero.

Un puntero que no apunta a nada se suele poner a NULL por convenio (la idea es saber que puntero es valido y cual no).
  #5 (permalink)  
Antiguo 18/05/2013, 02:51
 
Fecha de Ingreso: septiembre-2011
Mensajes: 42
Antigüedad: 12 años, 7 meses
Puntos: 3
Respuesta: Free vs NULL

Entonces:

Usar free: libera la memoria asignada al puntero, porque termine de trabajar con él.
Asignar NULL: el puntero apunta a una nueva direccion de memoria (direccion 0), pero luego puede volver a apuntar a otra direccion de memoria.

Una última duda, al usar free puedo volver a utilizar ese puntero? debo pedir nuevamente memoria? (esa son 2 dudas :P)

Gracias!
__________________
"Porque nada se...
quiero saberlo todo"
  #6 (permalink)  
Antiguo 18/05/2013, 03:14
 
Fecha de Ingreso: agosto-2012
Mensajes: 601
Antigüedad: 11 años, 8 meses
Puntos: 83
Respuesta: Free vs NULL

"...pero luego puede volver a apuntar a otra direccion de memoria..."

Si, y aunque no la liberes tambien puedes reusar ese puntero (p.ej. las listas)

"...al usar free puedo volver a utilizar ese puntero? debo pedir nuevamente memoria?..."

Si y si; si bloqueas con malloc y liberas con free el puntero sigue apuntando a la direccion ahora ya no disponible para la aplicacion; si vuelves a bloquear con malloc ya tienes otra direccion (o la misma, no se sabe) utilizable por la aplicacion hasta el nuevo free o hasta que finalices.

Código:
int *num;//esto puede ser cualquier cosa, no necesariamente nulo
num = NULL;//ahora es nulo

num = malloc(sizeof(int));//bloqueas
num = 4;//asignas
free(num);//ahora la posicion de memoria sigue teniendo (int)4 pero no es accesible ni tampoco es nulo, segira siendo 4 hasta que esta aplicacion u otra bloquee esa direccion

num = NULL;//vuelve a ser nulo

num = malloc(sizeof(int));//posiblemente num seguira guardando 4
num = 5;//ahora vale 5

exit();//al finalizar por si solo se desbloquea la memoria, se recomienda desbloquear manualmente todo lo usado
Saludos
vosk
  #7 (permalink)  
Antiguo 18/05/2013, 04:42
 
Fecha de Ingreso: julio-2012
Mensajes: 375
Antigüedad: 11 años, 9 meses
Puntos: 28
Respuesta: Free vs NULL

En los nuevos estándares no se permiten las asignaciones númericas a punteros (tampoco las comparaciones), por lo que es posible que ese ejemplo no te compile.

Pero por lo demás vien vorsk. La teoría sería correcta :)

EDITO: Me equivoque, si que se puede pero tienes que hacerle un cast a puntero.
  #8 (permalink)  
Antiguo 18/05/2013, 10:48
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 1 mes
Puntos: 1360
Respuesta: Free vs NULL

Hey vosk creo que esto es lo que intentaste hacer.

Código C:
Ver original
  1. int *num;//esto puede ser cualquier cosa, no necesariamente nulo
  2. num = NULL;//ahora es nulo
  3.  
  4. num = malloc(sizeof(int));//bloqueas
  5. *num = 4;//asignas
  6. free(num);//ahora la posicion de memoria sigue teniendo (int)4 pero no es accesible ni tampoco es nulo, segira siendo 4 hasta que esta aplicacion u otra bloquee esa direccion
  7.  
  8. num = NULL;//vuelve a ser nulo
  9.  
  10. num = malloc(sizeof(int));//posiblemente num seguira guardando 4
  11. *num = 5;//ahora vale 5
  12.  
  13. exit();//al finalizar por si solo se desbloquea la memoria, se recomienda desbloquear manualmente todo lo usado

Voy a dejar un poco de terminología:
int *x; // Wild Pointer, por que el puntero por ahora se dice que contiene basura o una dirección no valida para su uno. También pasa cuando utilizas free y ahora la dirección a la que apunta no es valida.

Cuando usas malloc pero liberas la memoria y pierdes esa referencia se llama memory leak.

Hay lenguajes como Java donde tienen su propio GC (garbage collector) que se encarga de liberar automáticamente la memoria que ya no se vaya a usar.
  #9 (permalink)  
Antiguo 18/05/2013, 13:48
 
Fecha de Ingreso: agosto-2012
Mensajes: 601
Antigüedad: 11 años, 8 meses
Puntos: 83
Respuesta: Free vs NULL

Si eso, perdon lo escribi de memoria 5 minutos antes de ir a una boda y se me escapó el asterisco

Saludos
vosk
  #10 (permalink)  
Antiguo 31/05/2013, 02:07
 
Fecha de Ingreso: marzo-2013
Ubicación: Jaén, Andalucía
Mensajes: 129
Antigüedad: 11 años, 1 mes
Puntos: 2
Respuesta: Free vs NULL

a ver, según tengo yo entendido, los punteros primero le pasas el free, para liberar la memoria que tu mismo has reservado y después los apuntas a NULL por si falla y para futuras comprobaciones...en el ejemplo del abb para sacar el nodo hoja debes comprobar que su izquierda y derecha estén a NULL, espero k te sirva :P

Etiquetas: free, funcion, int, null, struct
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 11:54.