Violacion de Segmento en malloc y free
Hola
Estoy realizando un proxy en C y resulta que al pedir algunas páginas web el programa da 'violación de segmento' cuando hago un malloc o un free, es decir, al reservar memoria o liberarla. Además, el comportamiento de estas instrucciones es aleatorio, es decir, normalmente funcionan bien pero de repente fallan ( a lo mejor después de haber pasado 100 veces por dicho trozo de código).
Mi pregunta es ¿alguien sabe por qué puede dar violacion de segmento el malloc y el free? ¿ha alguien le ha pasado algo parecido?
Espero su ayuda
Gracias y un saludo :)
Estoy realizando un proxy en C y resulta que al pedir algunas páginas web el programa da 'violación de segmento' cuando hago un malloc o un free, es decir, al reservar memoria o liberarla. Además, el comportamiento de estas instrucciones es aleatorio, es decir, normalmente funcionan bien pero de repente fallan ( a lo mejor después de haber pasado 100 veces por dicho trozo de código).
Mi pregunta es ¿alguien sabe por qué puede dar violacion de segmento el malloc y el free? ¿ha alguien le ha pasado algo parecido?
Espero su ayuda
Gracias y un saludo :)
Tal vez sea un problema con la pila, no seria la primera vez que lo veo.
Que compilador usas y en que entorno estas trabajando? Probaste a pasarlo por un debugger?
Saludos,
Mariano http://www.c0d3rz.com.ar
Que compilador usas y en que entorno estas trabajando? Probaste a pasarlo por un debugger?
Saludos,
Mariano http://www.c0d3rz.com.ar
Ese comportamiento aleatorio, en general, indica la mala noticia de que se está haciendo algo mal con los punteros, al crearlos y/o al liberar su memoria asignada. Si estubieras trabajando en C++ yo te diría que uses new y delete en lugar de malloc y free, pero en C no hay otra alternativa más que hacer las cosas bien.
Alejandro
Alejandro
Como comenta Alejandro, ese problema se presenta cuando hay algún error al usar punteros.
Si haces free() dos veces de la misma dirección de memoria o haces free() de una direccion de memoria que previamente no has reservado con malloc(), luego puede fallarte cualquier llamada a malloc() o free() de forma más o menos aleatoria.
Con new o delete en C++ tendrás el mismo problema, porque al final estos operandos acaban llamando a malloc() y free().
No te queda más remedio que revisar todos los free() de tu programa para ver si hay alguno indebido. En http://www.geocities.com/chuidiang/funciones/punteros.html tienes algunos de los fallos más comunes y menos evidentes. En http://www.cs.colorado.edu/~zorn/MallocDebug.html tienes algunas herramientas que ayudan a depurar errores con punteros.
Se bueno.
Si haces free() dos veces de la misma dirección de memoria o haces free() de una direccion de memoria que previamente no has reservado con malloc(), luego puede fallarte cualquier llamada a malloc() o free() de forma más o menos aleatoria.
Con new o delete en C++ tendrás el mismo problema, porque al final estos operandos acaban llamando a malloc() y free().
No te queda más remedio que revisar todos los free() de tu programa para ver si hay alguno indebido. En http://www.geocities.com/chuidiang/funciones/punteros.html tienes algunos de los fallos más comunes y menos evidentes. En http://www.cs.colorado.edu/~zorn/MallocDebug.html tienes algunas herramientas que ayudan a depurar errores con punteros.
Se bueno.
