SoloCodigo
Programación General => C/C++ => Mensaje iniciado por: dmairena en Jueves 17 de Junio de 2004, 20:20
-
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.
-
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
-
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:
-
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!