Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Clases + new + struct + malloc = muerte subita

Iniciado por shephiroth, 17 de Enero de 2007, 12:59:39 AM

« anterior - próximo »

shephiroth

Buenas.

Necesito ayuda. Primero pongo en precedentes. Necesito a alguien experto en c++, en el tema de "Debug Assertion Failed". No se muy bien cual es el codigo que genera el problema. Hasta ahora utilizaba la clase tranquilamente, todo rulaba. Pero en cuanto he metido el codigo para permitir mas de un objeto de la clase, casca. Y casca en sitios tontos y de maneras estupidas.

Ahora explico un poco de que va la clase por encima y como esta estructurada. Es un cargador de archivo, le pasan la direccion al archivo. Lo abre, en un char* texto_raw lo dimensiona con malloc y lo rellena con el archivo, y este lo cierra. Tengo diversas estructuras que apuntan directamente a texto_raw en su lugar indicado. A parte tengo otras variables auxiliares, lo mas destacable seria un vector de clases A que contiene clases hijas. Lo mas destacable de las hijas es q contienen diferentes estructuras internas. La clase base tiene varias staticas y algunas virtuales.

En cuanto al error en si, he conseguido poniendo infinidad de printf donde salta pero como ya dije ayer salta en sitios q no vienen a cuento (en el fclose despues de leer todo correcto y sin fallos). El assert me salta en dbgheap.c linea 1252 (aunque no se si sirve de algo). Llevo algo mas de dia y medio parado, y hace como una semana tuve q comenzarlo denuevo pq me dio un problema parecido (aunque la linea del dbgheap era diferente) aunque como tenia mucho codigo estupido de pruebas no me moleste en buscar y directamente empece denuevo.

Bueno, me falta decir. Ya lo ultimo que hice fue sin trabajar nada con los objetos, para buscar el error solamente inicializo dos objetos uno detras de otro.....el primero no da error, el segundo si. Eso al intentar en compilacion en debug ejecutar sin debug. Si lo ejecuto en debug puro no da ni un solo fallo (y los objetos trabajan 100%, aparentemente). Intentar ponerlo en release es una odisea, falla al abrir el archivo...

Si alguien quiere mas informacion que me avise y le envio codigo por mail, o lo pongo por aqui, pero no quiero molestar a nadie ^^

GRACIAS ^^

Fran

Si no recuerdo mal de cuando trabajaba con C++ a mi ese tipo de cosas me pasaba con corrupciones de memoria. Cuando me salia de mi espacio "malloqueado" o "newaizado". No he visto código pero no puede ser q los objetos siguientes se estén montando en los anteriores, corrompan memoria, etc??? Y desestabilicen todo???.Lo q no entiendo es como no te da un pete en condiciones y no un assertion failiure.

Pogacha

Definitivamente es un memory leak.
O estas free()-zando o delete-ando dos veces lo mismo o has escrito fuera del espacio allocado.
Para corregir estos errores lo que te recomiendo es que:
1 - Code revision.
2 - Uses un memory leaks tracker
http://www.codeguru.com/cpp/cpp/cpp_mfc/mem_tracking/article.php/c825/
http://www.linuxjournal.com/article/6556
Este es del flipcode y la pagina no me responde, pero todavia esta en el cache de google:
http://209.85.165.104/search?q=cache:UZU-pTVuJjkJ:www.flipcode.com/tutorials/tut_memleak.shtml+memory+leaks+tracker+c%2B%2B&hl=es&gl=es&ct=clnk&cd=1
3 - Insertes tus propios assert y logs

Pero lo mas importante es el Code Revision, desglosa clases y piensa que estas fallando en la logica del diseño.

Ahora si nos enseñas el codigo te podría ayudar un poco mas.
Saludos y suerte.

Fran

Cita de: "Pogacha"Definitivamente es un memory leak.
O estas free()-zando o delete-ando dos veces lo mismo o has escrito fuera del espacio allocado.
Para corregir estos errores lo que te recomiendo es que:
1 - Code revision.
2 - Uses un memory leaks tracker
http://www.codeguru.com/cpp/cpp/cpp_mfc/mem_tracking/article.php/c825/
http://www.linuxjournal.com/article/6556
Este es del flipcode y la pagina no me responde, pero todavia esta en el cache de google:
http://209.85.165.104/search?q=cache:UZU-pTVuJjkJ:www.flipcode.com/tutorials/tut_memleak.shtml+memory+leaks+tracker+c%2B%2B&hl=es&gl=es&ct=clnk&cd=1
3 - Insertes tus propios assert y logs

Pero lo mas importante es el Code Revision, desglosa clases y piensa que estas fallando en la logica del diseño.

Ahora si nos enseñas el codigo te podría ayudar un poco mas.
Saludos y suerte.

Tal y como expuse anoche, I agree with Pogacha. Tiene toda esa pinta

_Grey

Dices que en Debug no te da errores y en Release si... bien, veras, en Debug, si la memoria no me falla, las variables van inicializadas con valores por defecto, cosa que en Release no.
Podria ser, es una posibilidad, que tengas un puntero que esta a NULL en la version Debug y con datos "basura" en la version Release. No seria estraño, todos lo tenemos en algun punto del codigo de alguno de nuestros objetos, que ese puntero se reutilice, seguramente tengas funciones que piden memoria cuando este esta a NULL, y que lo liberen cuando no es NULL antes de cojer memoria, la estariamos liando.
Procura tener en el constructor de la clase, el codigo necesario de iniciacion de todas las variables esa clase.

Tambien podria ser que nada de esto te sirva  :P  :roll: , dices que tienes cosas en static?? ves con cuidado si todas las instancias de esa clase esten compartiendo algo importante, y toqueteando sin que el resto de instancias lo sepan. En general las variables static en clases no tienen mucha utilidad, no abuses de ellas.

Ya nos contaras si te sirve algo de esto, saludos.

shephiroth

Voy a leerme esos enlaces y a ver si consigo hacerlo funcionar todo correctamente.

Ya os comentaré mas a la noche ^^, si no consigo arreglarlo cuelgo el codigo directamente

EDITANDO:
Respecto a deletes y frees los quite todos, asi que no puede ser por eso.
Respecto a los statics, solo tengo algunas funciones static en una clase base, con algunas funciones genericas...probare a sacarlas fuera de la clase y ponerlas como funciones fuera de las clases a ver q tal.
Voy a revisar los enlaces y probaré a ver q sucede ^^

shephiroth

Buenas.

Lo primero comentaros que no he podido localizar el problema exacto, pero quitando cosas han ido apareciendo problemas diferentes. Dentro de poco empiezo examenes y no voy a poder dedicarle mucho tiempo. Cuando los termine volveré a la carga xDD

Pero de mientras, este error no lo entiendo:

file = fopen(nombre,"rb");
if (! file)
{
printf("Error al abrir el archivo.\n");
return;
}
printf("OK\nDeterminando tamaño del archivo...");
fseek(file,0,SEEK_END);
size = ftell(file);
fseek(file,0,SEEK_SET);
printf("0x%08X bytes\nAsignando memoria...",size);
texto = (char*)malloc(sizeof(char)*(size+1));
printf("0x%08X-0x%08X\nVolcando contenido al disco:\n",texto,texto+size);
x=0;
while(x<size)
{
printf("Posicion 0x%08X...",texto+x);
leidos = fread(texto+x,1,size-x,file);
if (error = ferror(file))
printf("error de lectura %i...",error);
x+=leidos;
printf("leidos 0x%08X, faltan 0x%08X.\n",leidos,size-x);
}
texto[size]=0;

Como siempre, en debug traga, pero ejecutar en release falla en el fread...

SALUDOS ^^

shephiroth

Problema encontrado.


struct tutia *tustias = (struct tutia*)malloc(sizeof(struct tutia)*14);
...
tustias[14].nombre = ....;


Con ampliar el array a 15 se ha solucionado todo (buen, hay otros problemas, pero no de heap corruption xDD).

GRACIAS a todos ^^






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.