voto ventajas tesis sobre que mundo funciona electronico desventajas como antecedentes c memory-leaks core coredump

ventajas - corrupción de la memoria



tesis sobre netflix (7)

estaba ejecutando un pequeño programa c:

#include<stdio.h> int main() { char *p; p = (char *)malloc(10); free(p); free(p); free(p); printf("/npointer is freed!!/n"); }

básicamente estoy liberando la memoria que ya ha sido liberada. creo que debería dar como resultado un vertedero central ¿no es así?

pero está imprimiendo

pointer is freed!!

¿Me equivoco en algún lugar?


Depende de la implementación de su SO (Linux, Windows ...) que implemente esta función. Sus comportamientos pueden ser diferentes según el SO (comportamiento indefinido), por lo que no debe confiar en ellos y debe liberar solo una vez toda la memoria asignada en su programa.

EDIT: no es parte del sistema operativo, sino de la biblioteca estándar, que difieren según el sistema operativo.


Esperaría que las compilaciones DEBUG de la mayoría de los compiladores puedan detectar este tipo de falla e informar exactamente qué sucedió. Lo mismo haría MSVC.

En RELEASE, podría optimizarse para generar un comportamiento impredecible más rápido.


Hay varios problemas con su programa:

  1. Como está utilizando malloc() y free() , debe hacer #include <stdlib.h> antes de llamar a cualquiera de esas funciones.
  2. No es necesario convertir el valor de retorno de malloc() : devuelve un void * , que se puede asignar a cualquier otro tipo de puntero de forma segura (excepto los punteros de función). Entonces, puedes hacer: p = malloc(10);
  3. Una vez que libera un puntero asignado por malloc() o realloc() , utilizar el valor del puntero de cualquier manera es malo: en particular, no puede volver a llamar a free() .
  4. int main() está mejor escrito como int main(void) .
  5. Dado que main() devuelve int , debe devolver un valor. Tradicionalmente, 0 significa éxito.

Por supuesto, el problema principal (sin juego de palabras) con su programa es liberarlo muchas veces, pero otros problemas mencionados anteriormente también son importantes. Una vez que hayas free() el puntero free() ''da con éxito, llamar a free() en él es un comportamiento indefinido: el programa puede hacer cualquier cosa, incluso (desafortunadamente), pareciendo no hacer nada malo . Digo "desafortunadamente" porque podría darle una sensación de seguridad de que está bien free() un puntero más de una vez.


La corrupción del montón no necesita causar el problema de inmediato. Podría suceder que la memoria liberada (o parte de la memoria) se utilice para asignar otra estructura y, a continuación, podría causar un problema. free memoria más de una vez siempre es UB (indefinido) y no debe hacerse incluso si no ve efectos malvados en ese momento.


Según la página man, "si free (ptr) ya se ha llamado antes, se produce un comportamiento indefinido".

No necesita explotar; "no hacer nada" es un comportamiento indefinido perfectamente aceptable. También son demonios nasales. No confíes en eso


Solo para agregar a las otras respuestas, me gustaría notar que si configura el puntero a NULL y luego se llama free (), el comportamiento ya no estaría indefinido. Es casi una no-op. Sin embargo, si se libera el puntero y se vuelve a llamar a free () sobre él antes de asignar el puntero a una ubicación diferente (incluso NULL), no puede estar seguro de lo que sucede. Podría dar lugar a un vuelco del núcleo en algunas implementaciones y no pasaría nada en algunos otros.


liberando la memoria ya liberada, conduce a un comportamiento indefinido, tienes suerte, en este caso, otras veces puedes obtener tu núcleo-vertedero