Error en malloc()

Iniciado por soyloqbuskas, 9 Noviembre 2012, 03:39 AM

0 Miembros y 2 Visitantes están viendo este tema.

soyloqbuskas

¡Buenas a todos!

Tengo un problema con la funcion malloc() porque me da fallo de segmentacion....el codigo es como este...


char* funcion(int sizeMalloc){
     char* buffer=(char*)malloc(sizeMalloc)
     return buffer;
}


El error que me da es este:
Citarmalloc.c:2451: sYSMALLOc: Assertion `(old_top == (((mbinptr) (((char *) &((av)->bins[((1) - 1) * 2])) - __builtin_offsetof (struct malloc_chunk, fd)))) && old_size == 0) || ((unsigned long) (old_size) >= (unsigned long)((((__builtin_offsetof (struct malloc_chunk, fd_nextsize))+((2 * (sizeof(size_t))) - 1)) & ~((2 * (sizeof(size_t))) - 1))) && ((old_top)->size & 0x1) && ((unsigned long)old_end & pagemask) == 0)' failed

Y la pila es esta:
Citar(gdb) bt
#0  0x00132416 in __kernel_vsyscall ()
#1  0x001611df in __GI_raise (sig=6) at ../nptl/sysdeps/unix/sysv/linux/raise.c:64
#2  0x00164825 in __GI_abort () at abort.c:91
#3  0x001a8469 in __malloc_assert (assertion=<optimized out>, file=<optimized out>, line=2451, function=0x29518a "sYSMALLOc") at malloc.c:300
#4  0x001ab293 in sYSMALLOc (av=0x2d9440, nb=40) at malloc.c:2448
#5  _int_malloc (av=0x2d9440, bytes=35) at malloc.c:3892
#6  0x001acddc in __GI___libc_malloc (bytes=35) at malloc.c:2924

¿Cual es el problema? ¿Como lo soluciono?

Gracias, un saludo.
"Si tienes 1 manzana y yo tengo otra manzana...
y las intercambiamos, ambos seguiremos teniendo 1 manzana.
Pero...si tu tienes 1 idea y yo tengo otra idea...
y las intercambiamos, ambos tendremos 2 ideas."


George Bernard Shaw

naderST

Te falta el punto y coma ( ; )


char* funcion(int sizeMalloc){
    char* buffer=(char*)malloc(sizeMalloc);
    return buffer;
}

soyloqbuskas

Eso es porque he copiado mal....
El codigo es:
char* funcion(int sizeMalloc){
     char* buffer=(char*)malloc(sizeMalloc);
     return buffer;
}


Y mi error no es de compilacion es un fallo de segmentacion....Estoy debugeando el programa porque los malloc() en general me dan este error y no se porque....

¿Alguien sabe sobre bugs del malloc() o de alguna funcion que me permita reservar memoria y que no de errores?

Gracias, un saludo.
"Si tienes 1 manzana y yo tengo otra manzana...
y las intercambiamos, ambos seguiremos teniendo 1 manzana.
Pero...si tu tienes 1 idea y yo tengo otra idea...
y las intercambiamos, ambos tendremos 2 ideas."


George Bernard Shaw

MikeMonostone

Si lo que intentas es asignar dinamicamente memoria y estas en C++ puedes usar new y delete, no¿?
[SK-DOOM] Pensé que lo que haría sería fingir ser uno de esos sordomudos.

DickGumshoe

Si lo que quieres es reservar sizeMalloc espacios de char, debes hacer esto:

char* funcion(int sizeMalloc){
     char* buffer=(char*)malloc(sizeMalloc * sizeof(char));
     return buffer;
}


Un saludo.

0xDani

Y ese es todo el codigo? Quiza el error esta en otro sitio. O a lo mejor estas intentando reservar demasiada memoria, comprueba que malloc() no este retornando NULL.
I keep searching for something that I never seem to find, but maybe I won't, because I left it all behind!

I code for $$$
Hago trabajos en C/C++
Contactar por PM

rir3760

Cita de: DickGumshoe en  9 Noviembre 2012, 15:18 PMSi lo que quieres es reservar sizeMalloc espacios de char, debes hacer esto:

char* funcion(int sizeMalloc){
     char* buffer=(char*)malloc(sizeMalloc * sizeof(char));
     return buffer;
}
Es valido pero innecesario. Ya que tanto la conversión explicita como el tamaño del objeto ("sizeof(char)" siempre es igual a uno) se pueden eliminar la función se reduce a:
char *funcion(int sizeMalloc)
{
   return malloc(sizeMalloc);
}

Considerando que no hay ningún proceso adicional seria mejor llamar a "malloc" directamente.

Cita de: soyloqbuskas en  9 Noviembre 2012, 03:39 AMTengo un problema con la funcion malloc() porque me da fallo de segmentacion....el codigo es como este...
Solo con el código fuente de la función no es posible indicarte la causa del problema que mencionas y te puedo asegurar que, salvo un caso excepcional, el error esta en otro lugar.

Lo recomendado en un caso como este es publicar el programa mas pequeño posible que exhiba el problema, en base a el ya podemos buscar que esta mal.

Un saludo
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language

soyloqbuskas

Creo que ya se el problema....mi funcion que crea el malloc() es llamada por un bucle infinito....y aun que en el bucle hago el free() del malloc()....el hacer muchos malloc() y free() debe de dar problema....Por lo que he leido....(no se si me he enterado bien, estaba la info en ingles...) hacer un malloc() hace reserva dinamica de la memoria pero ha veces esa reserva la intenta hacer sobre direcciones de memoria no permitidas.....y si hago malloc() dentro de un bucle infinito, solo es cuestion de tiempo que acabe intentando reservar memoria en una zona no permitia por el SO.....lo que voy a probar es a hacer el malloc() fuera del bucle y parsarle la varible con el malloc() a la funcion que lo usa....Seguramente asi lo solucione.....
"Si tienes 1 manzana y yo tengo otra manzana...
y las intercambiamos, ambos seguiremos teniendo 1 manzana.
Pero...si tu tienes 1 idea y yo tengo otra idea...
y las intercambiamos, ambos tendremos 2 ideas."


George Bernard Shaw

Foxy Rider

#8
A ver ...

1) Por favor, si tenés una función que tiene la funcionalidad de malloc(), podrías hacer algo como esto:

C

void* Alloc(size_t stringSize)
{
       void* stringMemory = malloc(stringSize);
               if (!stringMemory) fprintf(stderr,"strAlloc() failed !!! malloc returned nullptr  \r\n"); /* Aca deberia ir un codigo que maneje de manera agraciada la falta de memoria */

       return stringMemory;
}



C++
Código (cpp) [Seleccionar]

template <typename T>
T* Alloc(std::size_t memorySize)

{
       T* reservedMemory;

       try
       {
               reservedMemory = (T*) new char[memorySize];
       }
       catch (std::exception& mExcept)
       {
                std::cerr << "strAlloc() failed // " << mExcept.what() << std::endl; // Aca deberia ir un codigo que maneje de manera agraciada la falta de memoria
       }

       return reservedMemory;
}





Verificá siempre el retorno del pedido de memoria ... salvo que hablemos de algo despreciable

2) Si te interesa saber sobre problemáticas de memoria de tu aplicación, te aconsejo ver alguna aplicación como Valgrind

Saludos.

P.S//Edit → Recién me avivo de que al código en "C" le puse "string" (por que era char* el tipo) a las variables, pero que después dije "screw this" y le mandé un void y no renombré ... same thing lol