Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: egyware en 26 Noviembre 2011, 14:58 pm



Título: Corrupción de memoria en C++ al pasar una variable
Publicado por: egyware en 26 Noviembre 2011, 14:58 pm
Buenas Tardes
Tengo un problema de corrupción de memoria en uno de mis programas. Les cuento el chiste para que vean cual es mi problema (que ni google me ha podido ayudar :( )
Tengo una DLL que a travez de una función de una clase devuelve una variable que es del tipo b2World y con eso puedo crear nuevos cuerpos fisicos(petición de memoria). Cuando en mi programa (el que usa la DLL) trata de crear cualquier cuerpo fisico se cae, de hecho al hacer muchas depuraciones me he dado cuenta que los datos cambian cuando se pide más memoria.  Sin embargo cuando hago exactamente el mismo codigo para crear el body dentro de la misma DLL, este no se cae.
En la dll le tengo puesto todos los dllimport y dllexport, a excepción de box2d que  lo linkeo estaticamente tanto en la dll y en el programa.Tanto como la dll y el programa tengo el codigo.
Estoy usando Visual Studio (pero tengo  los mismos problemas al usar otro compilador codeblocks-mingw).

Espero que puedan ayudarme porque yo he buscado en google y no he pillado nada(de seguramente palabras de busqueda incorrectas).
Gracias de antemano.
Saludos


Título: Re: Corrupción de memoria en C++ al pasar una variable
Publicado por: Unbr0ken en 27 Noviembre 2011, 07:43 am
Al momento de crear esos "cuerpos", ¿los haces en la memoria tuya o de un proceso externo?...


Título: Re: Corrupción de memoria en C++ al pasar una variable
Publicado por: Eternal Idol en 27 Noviembre 2011, 12:08 pm
Los datos que dan no son suficientes como para adivinar nada siquiera, igual proba a pasarle el Application Verifier (http://www.microsoft.com/download/en/details.aspx?id=20028), tal vez detecte el error ...


Título: Re: Corrupción de memoria en C++ al pasar una variable
Publicado por: egyware en 27 Noviembre 2011, 14:28 pm
Bueno
-- DLL
- World.h http://pastebin.com/j65fvA4K (linea
- World.cpp http://pastebin.com/TkxgPEZi
-- Program
- Gameloop.h http://pastebin.com/wNKUW55G
- Gameloop.cpp http://pastebin.com/1S3NEw6L problema en linea 7 y 12

Les paso el codigo para que tengan una idea (este no compila, le faltan cosas por sacar para que quede compilable).
Bueno la DLL la compilo y lo linkeo estaticamente con Box2D y al programa, le linkeo la DLL y Box2D(biblioteca estatica)
En la linea 2 y 3 creo el Mundo y obtengo el b2World, las lineas que siguen son para definir un body  y en la linea 7 se cae por corrupcion de memoria (lo he seguido paso a paso y cuando Box2d pide memoria cambian los datos(por ejemplo habia una variable en 1 y luego del allocate sale en 1231231) y se cae.
Ahora en vez de hacer la linea 7 yo puedo usar una funcion alternativa:
Código
  1. b2Body *World::createBody(b2BodyDef *def){
  2.        return world.CreateBody(def);
  3. }
  4.  
definida en la linea 30 de World.h y FUNCIONA!!!, pero ahora se cae en la linea 12.
También he intendado copiar todo el codigo y compilarlo en la DLL y FUNCIONA TAMBIÉN!!!
Entonces lo que creo que sucede que el problema esta en pasar la variable
Código
  1. b2World &world = m_world->getWorld();
Linea 3 de Gameloop.cpp
pero ¿por qué? :huh: :huh: :huh:
No tengo idea.
Saludos, gracias de antemano


Título: Re: Corrupción de memoria en C++ al pasar una variable
Publicado por: Eternal Idol en 27 Noviembre 2011, 17:39 pm
Configura el Application Verifier sobre el ejectuable y depura esta parte especialmente:
Código
  1. m_world = new World();
  2. b2World &world = m_world->getWorld();

¿Llama al constructor de la clase como debe ser? ¿Es m_world una instancia valida cuando llamas a getWorld (comproba las propiedades del objeto)?