Hola, gente.
Lo que me trae en este caso es una duda con la función free, con el libro que estoy estudiando punteros a cada instante remarca que la función free es insegura, no pongo aquí los argumento porque necesitaría 2 post, la pregunta es ¿por su experiencia consideran que esto es cierto?, debería utilizar la función que dejo a continuación o es esto una falacia. -
#include <stdio.h>
#include <stdlib.h>
#define safeFree(p) saferFree((void**)&(p))
void saferFree(void **pp);
int main( void ){
int *pi;
pi = (int*) malloc(sizeof(int));
*pi = 5;
printf("\n Antes.....: %p\n",pi);
safeFree(pi);
printf("\n Despues...: %p\n",pi);
safeFree(pi);
return (EXIT_SUCCESS);
}
void saferFree(void **pp) {
if (pp != NULL && *pp != NULL) {
free(*pp);
*pp = NULL;
}
}
Saludos.
Daniel
La función free hace exactamente lo que debe hacer, que es liberar memoria. Ya si sigues guardando el puntero o no, no depende de free.
Yo de ti, trataba de acordarme siempre manualmente de liberar, y si es necesario (que no siempre tiene por qué serlo), asignar NULL a la variable. Vamos, que si te acuerdas de llamar a "saferFree" te acuerdas de hacer =NULL xD
En verdad C es de por sí inseguro y solo le interesa la velocidad y la libertad del programador. A parte del ensamblador es, seguramente, el lenguaje más libre_de_hacer_lo_que_quieras que haya circulando por el mundo.
Es como un gran muscle car sin control de derrape, ni abs, ni de tracción activa: o eres un buen piloto o no le sacas todo el partido al coche o, peor aún, te estrellas.
Hola, ivancea96.
Bien, NULL hace que el puntero no apunte a un dato valido, de esta manera, nos aseguramos que si accidentalmente invocamos a este puntero no apunte a la dirección que reservamos con malloc (que contendrá basura), espero estar acertado en este concepto. -
En cuanto a lo que hace free() parase un poco más complejo, voy a seguir leyendo para saber el porqué de tanto énfasis del libro en lo utilizar free() a secas y utilizar la función que se sugiere en el mismo. -
Gracias a ambos por ocuparse.
Saludos.
con null seria suficiente
La cosa es que si intentas acceder a un puntero liberado por free, pero que no se ha llevado a NULL, nadie se va a quejar y el programa puede seguir corriendo y puedes ver los efectos de una cascada de errores más adelante, difícil de depurar si el error se ha ido transmitiendo bastante lejos. Pero si llevas a NULL el puntero, al siguiente acceso que hagas a él para escribir te tirará error con lo que ya sabrás que ese puntero se ha liberado antes de lo previsto, así puedes localizar el error con más precisión.
MAFUS, como siempre muchas gracias por tus aportes. -
Saludos.