| 
	
		|  Autor | Tema: Reemplazar la función free por una propia.  (Leído 3,949 veces) |  
	| 
			| 
					
						| NOB2014 
								 
								
								 Desconectado 
								Mensajes: 366
								
								   | 
 
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) {		*pp = NULL;	}}
 Saludos. Daniel
 
 |  
						| 
								|  |  
								|  |  En línea | 
 
 abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.- |  |  |  | 
			| 
					
						| ivancea96 
								       
								
								 Desconectado 
								Mensajes: 3.412
								
								 
								ASMático
								
								
								
								
								
								     | 
 
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 línea | 
 
 |  |  |  | 
			| 
					
						| MAFUS 
								       
								
								 Desconectado 
								Mensajes: 1.603
								
								   | 
 
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.
 |  
						| 
								|  |  
								|  |  En línea | 
 
 |  |  |  | 
			| 
					
						| NOB2014 
								 
								
								 Desconectado 
								Mensajes: 366
								
								   | 
 
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.
 |  
						| 
								|  |  
								|  |  En línea | 
 
 abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.- |  |  |  | 
			| 
					
						| + 1 Oculto(s) 
								
								 Desconectado 
								Mensajes: 298
								
								 
								un defecto se puede convertir en una virtud
								
								
								
								
								
								     | 
 
con null seria suficiente |  
						| 
								|  |  
								|  |  En línea | 
 
 |  |  |  | 
			| 
					
						| MAFUS 
								       
								
								 Desconectado 
								Mensajes: 1.603
								
								   | 
 
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. |  
						| 
								|  |  
								|  |  En línea | 
 
 |  |  |  | 
			| 
					
						| NOB2014 
								 
								
								 Desconectado 
								Mensajes: 366
								
								   | 
 
MAFUS, como siempre muchas gracias por tus aportes. -
 Saludos.
 |  
						| 
								|  |  
								|  |  En línea | 
 
 abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.- |  |  |  |  |  
 
	
 
 
				
					
						| Mensajes similares |  
						|  | Asunto | Iniciado por | Respuestas | Vistas | Último mensaje |  
						|   |   | Funcion reemplazar en Visual basic 6.0
							« 1 2 » Programación Visual Basic
 | merlin | 10 | 10,238 |  4 Junio 2007, 07:57 am por merlin
 |  
						|   |   | escape_string es una funcion propia de PHP? PHP
 | Shell Root | 2 | 4,382 |  8 Marzo 2010, 14:09 pm por Castg!
 |  
						|   |   | [C] [?] Función free() y uso posterior Programación C/C++
 | iplazlac | 2 | 3,570 |  21 Noviembre 2010, 18:35 pm por iplazlac
 |  
						|   |   | reemplazar funcion en la IAT Análisis y Diseño de Malware
 | tig0 | 0 | 2,995 |  13 Septiembre 2011, 17:58 pm por tig0
 |  
						|   |   | Funcion strcpy() propia Programación C/C++
 | juanma97 | 7 | 4,519 |  24 Febrero 2017, 01:40 am por BloodSharp
 |    |