Foros - Stratos

Programadores => General Programadores => Mensaje iniciado por: CoLSoN2 en 08 de Agosto de 2004, 08:10:53 PM

Título: Expedientes X En Modo Release
Publicado por: CoLSoN2 en 08 de Agosto de 2004, 08:10:53 PM
 A parte de:
- Contención (o no) de información simbólica
- Optimizar el output (o no)
- Inicialización de variables a 0 (o no)
¿En qué se diferencian el modo Debug del modo Release?

Tengo una aplicación que funciona `perfectamente´ en modo Debug (uso MSVC6 + SP6). La cosa es que si compilo y ejecuto en modo Release hace cosas rarísimas, pongo un ejemplo:

Tengo un template Singleton:

template <typename T>
class Singleton {
public:
 static inline T* get() {
  static T instance;
  return &instance;
 }
};

del que derivan varias clases, como GuiManager.
Luego tengo:


GuiManager::GuiManager() {
Log("gui manager created");
}


Después de ejecutar la aplicación y del crash que se produce (debido a este mal funcionamiento general que comento), en el fichero log pueden verse varios "gui manager created" en distintos puntos del fichero, cuando SIEMPRE llamo al manager utilizando GuiManager::get()->.. lo que me lleva a pensar que el constructor se llama varias veces, cuando la variable es static. La pregunta, obviamente, es ¿PORQUE?

Si soluciono esto podria ver si otros expedientes x que se producen son realmente causa de este o no (podría bien ser, debido a cómo está montado todo)..

un saludo
Título: Expedientes X En Modo Release
Publicado por: Zaelsius en 08 de Agosto de 2004, 08:30:20 PM
 Buscando en google "vc6 inline singleton bug" he encontrado cosas como esta:

http://www.flipcode.com/cgi-bin/msg.cgi?sh...m=general&id=-1
Citar
....

This works fine in debug mode, but in release mode, some singletons are instantiated twice, and I get lots of null pointer errors.

...

Colson parece que no estás solo XD. Podrias probar a que alguien te lo compilase en VC7. Por lo visto(yo pasé del 5 al 7) el VC6 tenia algun que otro bug feo... mira la primera entrada de Google porque tambien comentan algo de eso(aunque no lo he leido entero).

Al final la solución es pasar de singletons :(  o irte a otro lenguaje si no quieres POO tocapelotas jajaaj.
Título: Expedientes X En Modo Release
Publicado por: CoLSoN2 en 08 de Agosto de 2004, 11:15:46 PM
 pse. y qué pretendes que use? variables globales???!! NO! xD
A ver si consigo de una vez el vc7, porque el 6 sí que me tiene un poco mosca ya..  
Título: Expedientes X En Modo Release
Publicado por: ethernet en 09 de Agosto de 2004, 08:20:40 AM
 Variables globales rocks, singletones sucks
Título: Expedientes X En Modo Release
Publicado por: seryu en 09 de Agosto de 2004, 09:38:26 AM
 por curiosidad, porque siempre que sale la palabra singleton la rechazas con un simple sucks, me gustaria saber tu opinion al respecto de porque no deberian utilizarse.

Vamos, una respuesta mas elaborada que el simple apestan en su formato anglicista.
Título: Expedientes X En Modo Release
Publicado por: ethernet en 09 de Agosto de 2004, 10:24:50 AM
 Por el simple hecho de que si metes un singleton en un dll, por ejemplo vas a empezar a tener miles de problemas (de linker, de heap...).hasta hace nada yo era defensor de los singletones hasta que programando un manager me di cuenta de que dan mas problemas que ventajas. Ademas, tener una variable global de una clase sinceramente no es tan cutre y al final lo que importa es que funcione :). Que mas te da tener algo asi:


class MyMesh
{
     void Load(params...)
     {
             .....
              TextureManager::load(tex);
      }
}


que


class MyMesh
{
     void Load(params,..., TextureManager* mngr = GTextureManager)
     {
             .....
              mngr->load(tex);
      }
}


Apruebo el uso del singleton siempre que estos tengan un allocator como dios manda, es la unica forma de q tiren bien
Título: Expedientes X En Modo Release
Publicado por: fiero en 09 de Agosto de 2004, 02:30:34 PM
 Internamente, una vez compilado el código, una variable global se comporta igual que una static dentro de una clase. Así que igual dá.
Yo hay muchas cosas de POO que desconozco, pero la verdad es que todavia no he tenido la necesidad de aprender esas cosas tan "raras".

Como dice ethernet, lo que importa es que funcione. Pocas cosas hay tan claras y simples como una variable global.

Joder, no logro acordarme del último error que tuve debug-release, esto me pasa por no apuntar las cosas... si lo recuerdo igual te ayuda

un saludo
Título: Expedientes X En Modo Release
Publicado por: CoLSoN2 en 09 de Agosto de 2004, 03:14:35 PM
 pues ya está solucionado. Cambié el template para que usara una variable miembro static alojada dinámicamente, y luego cada clase que deriva de Singleton tiene un método release() cuya última línea es 'delete this', y ya no hay petes ni leaks. Pero me parece una guarrada xDDD con lo bien que quedaba lo otro..
Título: Expedientes X En Modo Release
Publicado por: Helius en 09 de Agosto de 2004, 04:05:34 PM
 Por si te sirve de algo te muestro mi clase singleton:


template<typename T>
class CSingleton
{
private:
 
 static T* ms_singleton;

 
public:

 ~CSingleton()
 {
  ms_singleton=NULL;
 }
 
 static inline T& GetSingleton()
 {
  Assert(ms_singleton,"No existe singleton al intentar instanciarlo");
  return *ms_singleton;
 }

 static inline T* GetSingletonPtr()
 {
  return ms_singleton;
 }

 static inline void NewSingleton()
 {
  if (ms_singleton == NULL)
   ms_singleton = new T;

  Assert(ms_singleton,"No existe singleton al intentar instanciarlo");
 }
};

template <typename T> T* CSingleton <T>::ms_singleton = NULL;


A mi me va perfectamente y si lo prefieres puedes unir la función "NewSingleton()" y GetSingleton()" en una sóla.

Para acabar con el singleton sólo hay que hacer:
delete CManager::GetSingletonPtr();