Violacion de Segmento en malloc y free

Javier
31 de Mayo del 2004
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 :)

Mariano Ventaja
31 de Mayo del 2004
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

Alejandro_
31 de Mayo del 2004
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


chuidiang
31 de Mayo del 2004
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.