• Lunes 18 de Noviembre de 2024, 05:39

Autor Tema:  ¡¡free Me Cambia Cosas!!  (Leído 1134 veces)

dmairena

  • Nuevo Miembro
  • *
  • Mensajes: 4
    • Ver Perfil
¡¡free Me Cambia Cosas!!
« en: Jueves 17 de Junio de 2004, 20:20 »
0
Mi programa funciona correctamente, sin liberar punteros, pero cuando llamo a free al final, para liberar punteros, me cambia (sin hacer nada más) el contenido de otra cosa.

-¿Puede que el puntero esté apuntando a la memoria donde tengo guardado el dato que cambia?
-Free lo único que hace no es ponerlo a NULL, ¿por qué cuando lo pongo yo a NULL directamente ( puntero = NULL ) no hace lo mismo?

Estoy hecho un lío, si me pueden ayudar. Saludos. Daniel.

Ruben3d

  • Miembro HIPER activo
  • ****
  • Mensajes: 710
  • Nacionalidad: es
    • Ver Perfil
    • Web personal
Re: ¡¡free Me Cambia Cosas!!
« Respuesta #1 en: Jueves 17 de Junio de 2004, 20:24 »
0
Hola.

free no pone a NULL ningún puntero, simplemente marca la memoria a la que apuntaba como 'sin usar'. Es buena costumbre poner a NULL un puntero tras llamar a free. Si pones un puntero a NULL sin llamar a free estás dejando la memoria a la que apuntaba ocupada sin posibilidad de liberación.

Un saludo.

Ruben3d

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: ¡¡free Me Cambia Cosas!!
« Respuesta #2 en: Jueves 17 de Junio de 2004, 20:25 »
0
Funciona correctamente pero tiene leaks de memoria y eso no es bueno.

Ponerle NULL a un puntero es darle valor 0, NULL en Windows es una constante definidida a 0, cuando haces una malloc() pedis memoria al Sistema Operativo y no alcanza con poner a NULL lo que antes apuntaba a una dirección de memoria asignada por el S.O. lo que tenes que hacer es liberarla con free() y después darle un valor 0, por que? Porque esa dirección ya no es válida.


 :comp:  :hola:  :ph34r:

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

carmamezo

  • Miembro MUY activo
  • ***
  • Mensajes: 232
    • Ver Perfil
Re: ¡¡free Me Cambia Cosas!!
« Respuesta #3 en: Sábado 19 de Junio de 2004, 23:44 »
0
Hola,
Como bien han respondido anteriormente los compañeros debes realizar un free() después de cada llamada a malloc(), siempre que ya no necesites lo que hayas reservado.  
Ésta función te permite asignar espacios de memoria dinámicamente, cuando haces una llamada a malloc y asignas a un puntero esa direccion, esa memoria te pertenece y puedes hacer lo que quieras con ella, cargar datos...  Ahora bien, cuando la liberas (free) deja de pertenecerte, y por tanto el OS puede entregar ese espacio a otro programa.  En el mejor de los casos si intentas acceder a esa posición a través del puntero que tenías puede que te deje (en caso de que esa posición siga perteneciendo a tu programa pero la esté usando otra variable...) pero la información contenida podrá haber cambiado, y si la modificas puede que estés modificando sin saberlo datos de tu propio programa.  En el caso más habitual windows te calzará un famoso "access violation" que no es más que un puntero que apunta a una dirección de memoria que no te pertenece, y no te dejará acceder a esa información.
Por tanto, cuando reservas memoria es tuya, pero cuando la liberas deja de ser tuya.  De ahí que te hayan dicho que el puntero debe apuntar a NULL después de hacer free(), pues la dirección a la que apuntaba ese puntero ha dejado de ser tuya y para evitar problemas como los que te he mencionado antes es mejor dejar de apuntar a una dirección que ya no es válida.
Por último decirte que todo buen programador libera siempre los recursos que ya no necesita, y que se debe liberar antes de finalizar el programa todo aquello que has reservado.
En fin espero que te haya quedado un poco más claro....
Un saludo!
No hay tonto más molesto que el ingenioso.