Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: NOB2014 en 25 Abril 2016, 22:33 pm



Título: Reemplazar la función free por una propia.
Publicado por: NOB2014 en 25 Abril 2016, 22:33 pm
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. -

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. #define safeFree(p) saferFree((void**)&(p))
  5.  
  6. void saferFree(void **pp);
  7.  
  8. int main( void ){
  9. int *pi;
  10. pi = (int*) malloc(sizeof(int));
  11. *pi = 5;
  12.  
  13. printf("\n Antes.....: %p\n",pi);
  14.  
  15. safeFree(pi);
  16.  
  17. printf("\n Despues...: %p\n",pi);
  18.  
  19. safeFree(pi);
  20.  
  21. return (EXIT_SUCCESS);
  22.  
  23. }
  24.  
  25. void saferFree(void **pp) {
  26. if (pp != NULL && *pp != NULL) {
  27. free(*pp);
  28. *pp = NULL;
  29. }
  30. }

Saludos.
Daniel


Título: Re: Reemplazar la función free por una propia.
Publicado por: ivancea96 en 25 Abril 2016, 22:50 pm
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


Título: Re: Reemplazar la función free por una propia.
Publicado por: MAFUS en 26 Abril 2016, 01:10 am
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.


Título: Re: Reemplazar la función free por una propia.
Publicado por: NOB2014 en 26 Abril 2016, 01:22 am
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.


Título: Re: Reemplazar la función free por una propia.
Publicado por: + 1 Oculto(s) en 26 Abril 2016, 01:28 am
con null seria suficiente


Título: Re: Reemplazar la función free por una propia.
Publicado por: MAFUS en 26 Abril 2016, 01:34 am
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.


Título: Re: Reemplazar la función free por una propia.
Publicado por: NOB2014 en 26 Abril 2016, 02:51 am
MAFUS, como siempre muchas gracias por tus aportes. -

Saludos.