• Miércoles 24 de Abril de 2024, 04:41

Autor Tema:  Debug Assertion Failed  (Leído 3591 veces)

Diodo

  • Moderador
  • ******
  • Mensajes: 658
    • Ver Perfil
    • http://www.solocodigo.com
Debug Assertion Failed
« en: Domingo 26 de Noviembre de 2006, 09:56 »
0
Hola a todos

Tengo un problema relacionado con esta pregunta que hice:

http://foros.solocodigo.com/index.php?showtopic=25725&hl=

Resulta que ahora al usar el metodo de esa libreria (dll) con el siguiente codigo de llamada

Código: Text
  1.  
  2. void main()
  3. {
  4.   SMRentorno *ent=new SMRentorno("prueba");
  5.   SMRmodulo *mod3=new SMRmodulo("NomMod1");
  6.   SMRmodulo *mod1=new SMRmodulo("NomMod2");
  7.   SMRmodulo *mod2=new SMRmodulo("NomMod3");
  8.   ent->AgregarModulo(mod1);
  9.   ent->AgregarModulo(mod2);
  10.   ent->AgregarModulo(mod3);
  11.   for(int i=0;i<ent->GetNumModF();i++)
  12.     printf("%s",ent->modulosF[i]->GetNombre());
  13. }
  14.  
  15.  

Me salta el siguiente error de ejecucion:



en el error salta cuando esta dentro de la tercera llamada a AgregarModulo, cuando va a borrar los modulos de la clase SMRentorno para luego copiarle el ptro aux con el modulo mod3 añadido

Lo raro es que esto solo sucede cuando se trata de la libreria enlazada dinamicamente, si lo hago estaticamente no sucede ningun error

Alguien tiene idea de lo que puede suceder ???

Gracias

PD: el codigo del metodo AgregarModulo esta aqui

http://foros.solocodigo.com/index.php?showtopic=25725&hl=

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Debug Assertion Failed
« Respuesta #1 en: Domingo 26 de Noviembre de 2006, 12:41 »
0
Como no tengo todo el codigo no puedo ayudarte mas que diciendote que depures el programa y veas exactamente en que linea da el ASSERT. Pueden ser muchas cosas como por ejemplo liberacion incorrectas ... vaya uno a saber.

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

Diodo

  • Moderador
  • ******
  • Mensajes: 658
    • Ver Perfil
    • http://www.solocodigo.com
Re: Debug Assertion Failed
« Respuesta #2 en: Domingo 26 de Noviembre de 2006, 13:15 »
0
Ok gracias

Eso es lo que hice debugear y ver la linea de codigo que lanza el error, que es un delete de una reserva de memoria de un ptro a vectores que se hace en una funcion que agrega objetos modulos a un contenedor de modulos **modulosF , para vaciar lo que hay en ese contenedor y asignarle la posicion de memoria de un ptro aux donde ya se agrego el nuevo modulo

Código: Text
  1.  
  2. void SMRentorno::AgregarModulo(SMRmodulo *mod)
  3. {
  4.  
  5. SMRmodulo **aux; //contenedor aux para aumentar la dim y meter el nuevo mod
  6. int numA,num;
  7. if(mod->GetNivel()==SMR_N_MODULO) // si el modulo es del nivel que quiero
  8. {
  9. numA=this->GetNumModF(); // numA=numero de modulos sin añadir mod
  10. num=numA+1; // num= numero de modulos añadiendo mod
  11. aux=new SMRmodulo*[num]; // reserva de memoria en aux
  12. for(int i=0;i<numA;i++)  // recorro el contenedor de la clase SMRentorno
  13. {
  14.  aux[i]=new SMRmodulo(); // reserva de memoria
  15.   aux[i]=(this->modulosF)[i]; //y voy metiendo en aux su contenido
  16. }
  17. aux[numA]=new SMRmodulo(); // reserva de memoria
  18. aux[numA]=mod; // en el elemento [numA] meto el nuevo modulo
  19.  
  20.  
  21. for(int i=0;i<numA;i++) //recorro el contenedor de la clase
  22.   delete [] this->modulosF[i]; // y borro los modulos que tiene AQUI DA EL ERROR al meter el 3º modulo
  23. delete [] this->modulosF;  // y depues borro la reserva de memoria
  24.  
  25.  
  26. this->modulosF=aux; // finalmente hago que el ptro de la clase apunte al ptro aux
  27. this->SetNumModF(num); // actualizo el numero de modulos
  28. }
  29.  
  30. }
  31.  

Lo que no entiendo es por que me salta este error al introducir el tercer modulo y por que solamente me pasa cuando el enlace de la libreria es dinamico. Si fuera cosa del codigo tambien saltaria el error si estuviera la libreria estatica, no?

Quizas sea cosa de la dll?? el manejo de memoria dinamica es diferente para una dll?

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Debug Assertion Failed
« Respuesta #3 en: Domingo 26 de Noviembre de 2006, 15:54 »
0
Si tuviera el codigo del programa, aunque sea en una minima expresion que diera el problema lo meteria en el VS y lo analizaria ...

Puede ser que el problema se reduzca a que intentas liberar memoria reservada por la DLL desde el ejecutable o viceversa. HeapAlloc y HeapFree (llamadas por malloc y free, que son llamadas a su vez por new y delete) necesitan un parametro de tipo HANDLE para identificar el heap sobre el cual se hace la operacion. La CRT al iniciar llama a HeapCreate y recibe su propio HANDLE ...

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

Diodo

  • Moderador
  • ******
  • Mensajes: 658
    • Ver Perfil
    • http://www.solocodigo.com
Re: Debug Assertion Failed
« Respuesta #4 en: Domingo 26 de Noviembre de 2006, 17:08 »
0
He simplificado el problema lo maximo posible, dos clases: una contenedora y otra para meter en el contenedor (las dos con 1 solo atributo, el nombre)

He puesto ordenes de copia para los archivos dll y el .h en el postbuild del proyecto de la dll para que vayan a la carpeta "C:\...\Microsoft Visual Studio\MyProjects" y el archivo .lib al directorio "...\VC98\Lib"

El zip esta adjunto al mensaje.

Gracias por el interes
El mensaje contiene 1 archivo adjunto. Debes ingresar o registrarte para poder verlo y descargarlo.

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Debug Assertion Failed
« Respuesta #5 en: Domingo 26 de Noviembre de 2006, 18:10 »
0
Efectivamente, estoy usando Visual Studio 2003, y en el assert justo antes de saltar veo este comentario:

         /*
         * If this ASSERT fails, a bad pointer has been passed in. It may be
         * totally bogus, or it may have been allocated from another heap.
         * The pointer MUST come from the 'local' heap.
         */


Esta claro que estas reservando en el main de probatorio.exe y estas liberando esa memoria en libreria.dll, esto da error por los heaps como dice arriba y te explique antes. Por regla general NO se debe liberar memoria de otro modulo ... malloc/new y free/delete trabajan de manera "local". En pocas palabras eso es lo que pasa, hay muchas maneras de rediseñar el mecanismo asi que eso lo dejo en tus manos  :devil:

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

Diodo

  • Moderador
  • ******
  • Mensajes: 658
    • Ver Perfil
    • http://www.solocodigo.com
Re: Debug Assertion Failed
« Respuesta #6 en: Lunes 27 de Noviembre de 2006, 00:42 »
0
Gracias ¡¡


Pues maneras de hacerlo solo se me ocurre crear un metodo estatico de la clase al que se le pase el puntero y en el hacer la reserva de memoria. Mañana lo probare ....

Diodo

  • Moderador
  • ******
  • Mensajes: 658
    • Ver Perfil
    • http://www.solocodigo.com
Re: Debug Assertion Failed
« Respuesta #7 en: Lunes 27 de Noviembre de 2006, 13:41 »
0
Esto es un infierno ¡¡¡ Me sigue dando el mismo error

He probado a hacer esto:

En la dll:

Código: Text
  1. SMRmodulo *SMRmodulo::CrearModulo(char *nom)
  2. {
  3.   SMRmodulo *mod=new SMRmodulo(nom);
  4.   return mod;
  5. }
  6.  

En el ejecutable:

Código: Text
  1. SMRmodulo *mod1=SMRmodulo::CrearModulo("mod1");
  2.  


Asi se supone que la reserva de memoria se hace en el heap de la dll no?

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Debug Assertion Failed
« Respuesta #8 en: Lunes 27 de Noviembre de 2006, 14:55 »
0
Si pero hay algo que tambien me parecio raro:

Código: Text
  1.  
  2. delete /*[]*/ this->modulos[i];
  3. delete [] this->modulos;  
  4.  
  5.  

Estoy de acuerdo con que this->modulos lo creas con new[]() pero this->modulo lo creas con new(). El primero es un array pero el segundo no, proba ese cambio  :devil:

PD. Despues proba ese cambio con el new/delete usado antes  :devil:

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

Diodo

  • Moderador
  • ******
  • Mensajes: 658
    • Ver Perfil
    • http://www.solocodigo.com
Re: Debug Assertion Failed
« Respuesta #9 en: Lunes 27 de Noviembre de 2006, 15:14 »
0
Ahora si que va, MUCHAS GRACIAS

Ya para comprenderlo del todo que diferencia hay entre

delete [] clase;

y

delete clase;

El primero borra la reserva de memoria sin llamar al destructor y el otro simplemente llama al destructor de la clase??

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Debug Assertion Failed
« Respuesta #10 en: Lunes 27 de Noviembre de 2006, 15:19 »
0
Cita de: "Diodo"
El primero borra la reserva de memoria sin llamar al destructor y el otro simplemente llama al destructor de la clase??
No, delete hace lo mismo siempre (llamada al destructor + liberacion de memoria) PERO uno es para un elemento y el otro para arrays.

delete[]: The function called by a delete expression to deallocate storage for an array of objects.

delete: The function called by a delete expression to deallocate storage for individual of objects.

Por cierto, el otro arreglo es necesario, no se si lo habras probado como antes pero yo si y seguiria fallando si no estuvieran los dos arreglos juntos  :devil:

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

Diodo

  • Moderador
  • ******
  • Mensajes: 658
    • Ver Perfil
    • http://www.solocodigo.com
Re: Debug Assertion Failed
« Respuesta #11 en: Lunes 27 de Noviembre de 2006, 15:21 »
0
Ok, el otro delete si lo he mantenido

Ahora si que funciona creando los objetos en la aplicacion y no en la dll.

Asi que era cosa de ese maldito delete[]  ;)  

De todas maneras conviene mantener todo en un heap?? podria dar algun problema  mas?

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Debug Assertion Failed
« Respuesta #12 en: Lunes 27 de Noviembre de 2006, 15:26 »
0
Cita de: "Diodo"
Ok, el otro delete si lo he mantenido

Ahora si que funciona creando los objetos en la aplicacion y no en la dll.

Asi que era cosa de ese maldito delete[]  ;)  

De todas maneras conviene mantener todo en un heap?? podria dar algun problema  mas?
Si, como te mostraba antes:

Código: Text
  1.  
  2. delete /*[]*/ this->modulos[i];
  3. delete [] this->modulos;  
  4.  
  5.  

El primero estaba mal y el segundo estaba bien ya que era un array.

Las dos cosas saltan, tal vez como usas el VC 6.0 no lo veas pero con el .NET 2003 si que se ve, calcula que son asserts de la RTL ...

Si, conviene siempre tener todo en un heap (a menos que quieras hacerte cargo de la gestion de memoria a un nivel inferior). Yo creo que no te dara mas problemas que tal vez un miserable rendimiento debido a que no libere la memoria :lol:

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.