PDA

Ver la versión completa : Problema con SDL_FreeSurface() y destructores



efegea
16/07/2006, 23:04
Lo he posteado en el hilo del Call of Dracula pero lo voy a poner también aquí para que se vea.

Mi problema es el siguiente:

El juego, aleatoriamente, peta, y según el depurador, es siempre en la llamada a SDL_FreeSurface, pero no siempre en la misma llamada. Esas llamadas están en los destructores de las clases, por lo que siempre son llamadas una sola vez cuando la instancia es destruida. Pero parece como si intentase liberar una surface que ya no existe, pero estoy seguro de que existe. Si comento las llamadas a SDL_FreeSurface ya no se cuelga el juego, pero claro, hay un "memory leak", tengo que liberar las surfaces por c0jones.

Es como si el puntero que apunta a la surface apuntase a otro sitio, es decir que conteniese basura, pero no me explico por qué :confused: o quizás es otra cosa, no sé, tal vez es un fallo tonto pero no doy con el

< - >
No es solo SDL_FreeSurface, acabo de descubrir que peta con todo. Aún no me explico que es lo que pasa, pero lo que está claro es que siempre peta en el destructor de alguna clase, aunque alguna vez ha petado en otro sitio. Lo que si es siempre ALEATORIO :confused: :confused: :confused:

< - >
Como es posible que pete aquí:


delete state;
state=0;
--> state=new CState(m_new_state);

Peta en el operador new, según gdb:


free () from /lib/libc.so.6
malloc () from /lib/libc.so.6
operator new () from /usr/lib/gcc/x86_64-pc-linux-gnu/3.4.6/libstdc++.so.6
CStatemgr::update (this=0x56b9e0) at states.cpp:338
main (argc=-1419118552,argv=0x16,envp=0x0) at main.cpp:392

< - >
Lo cachondo es que ayer funcionaba perfectamente >_<

< - >
mmm..me he dado cuenta que lo del operador new solo ocurre cuando retrocedo un estado al estado anterior..por ejemplo cuando voy a una habitación en la que he estado antes

< - >
Pues no, no es cuando voy a la habitacion anterior, es aleatorio

me estoy volviendo loco [Ahhh]

< - >
¡Hurra! ¡lo solucioné! :)

Uncanny
17/07/2006, 00:51
Acabo de ver el hilo y ya veo que lo has solucionado, pero por simple curiosidad, ¿a que se debía el error? :confused:

efegea
17/07/2006, 00:55
Pues el jodido gdb me estaba diciendo que el causante del fallo era el operador new, pero para nada era eso. Al final era una surface que liberaba cuando no debía. Siempre los fallos que más te traen de cabeza acaban siendo los fallos más tontos.

Uncanny
17/07/2006, 01:07
Pues el jodido gdb me estaba diciendo que el causante del fallo era el operador new, pero para nada era eso. Al final era una surface que liberaba cuando no debía. Siempre los fallos que más te traen de cabeza acaban siendo los fallos más tontos.¿Tenías la superficie bloqueada e intentabas liberarla o algo así? Por cierto, tienes razón, los fallos tontos son los peores porque cuesta verlos xD

efegea
17/07/2006, 01:17
¿Tenías la superficie bloqueada e intentabas liberarla o algo así? Por cierto, tienes razón, los fallos tontos son los peores porque cuesta verlos xD

La superficie no estaba inicializada por lo que apuntaba a quien sabe que. Es en una clase en la que pasas un argumento "tipo" y según el tipo inicializa las superficies, pero en algunos tipos no son necesarias determinadas superficies por lo que no se inicializaban, pero en el destructor se liberaban todas sin importar el tipo. Ese era el fallo.

Lo que me pregunto yo, es porque gdb culpaba al operador new del fallo :confused:

fmayosi
17/07/2006, 03:37
Por qué intentaba crear un nuevo tipo de un null?

No sep, suy muy nuevo en la programación, pero es una idea que me ha venido a la cabeza. ;)

Espero no molestar a nadie, sólo respondo por curiosidad e intentar saber a que podía deberse por si acaso. ;)

Un saludo.