Crashes en contenedores de std que uso en una DLL

Iniciado por kafok, 2 Diciembre 2014, 00:10 AM

0 Miembros y 1 Visitante están viendo este tema.

kafok

Hola, necesito ayuda. Llevo un par de meses con un problema, aprovechando el tiempo y aprendiendo a depurar entre otras cosas, pero ya estoy llegando al limite, necesito solucionarlo yaa!!

Bueno mi problema es el siguiente, estoy desarrollando una libreria en dos versiones, dll y estatica. Y me encuentro con crashes por violacion de acceso por todos lados. Despues de mucho tiempo depurando y aprendiendo muchas cosas sobre implementaciones a bajo nivel mi proyecto tiene la siguiente pinta (de momento):


  • Una clase generica llamada Object de la que heredaran el resto de clases de mi proyecto. Por temas de diseño he tomado ese pratron y la verdad que me ha ayudado a solucionar gran parte de los problemas. Esta clase tiene sobrescritos new y delete para asignar y desasignar memoria en los lugares correctos, sino en la dll tenemos problemas.
  • Un par de clases que tienen atributos privados que son contenedores std como string y set.

Tengo el mismo problema tanto si es una dll como una libreria estatica. Con el siguiente codigo de pruebas resulta lo siguiente:

(.h) en la dll:
Código (cpp) [Seleccionar]

class Miclase    //Obviamente exportado con __declspec (dllexport) en el caso de la dll
{
   private:
       string str;

   public:
       Miclase();
       ~Miclase();

};


(.cpp) en la dll:
Código (cpp) [Seleccionar]
Miclase::Miclase()
{
   str = string("prueba");
}

Miclase::~Miclase()
{
}


La aplicacion que uso para testear las librerias tiene la siguiente pinta:

Código (cpp) [Seleccionar]
int main(int argc, char** argv)
{
   Miclase prueba[20];
   system("pause");

   return 0;
}


Use Un array para declarar distintas variables en los test

El codigo anterior crashea (el tipico window dejo de funcionar) por culpa de una violacion de acceso (codigo 0xC0000005 en windows o el procesador lanza una SIGSEGV, mismo efecto). El error esta en el destructor, en concreto en el destructor de la string en este caso. Pero pasa lo mismo con todos los contenedores de la std.

Cambiando estos codigos no produce ese error:

este:
Código (cpp) [Seleccionar]
string str;
por este:
Código (cpp) [Seleccionar]
string *str;

y este:
Código (cpp) [Seleccionar]
str = string("prueba");
por este:
Código (cpp) [Seleccionar]
str = new string("prueba");

se soluciona el problema, pero al usar delete en el destructor vuelve a suceder. Esto solo me pasa si son variables, si son punteros y usando new no hay ningun problema. Posiblemente sea por la asignacion dinamica de estas clases, como ya dije tengo sobrescrito new y delete y eso puede que haya solucionado algo... Pero el caso anterior necesita de una solocion, sino no podre continuar mi proyecto...  :-(

He probado todo ya, y no se que puede pasar, incluso he diseñado un allocator para estos tipos pero da el mismo resultado... ¿QUE PUEDO HACER?

Eternal Idol

Cita de: kafok en  2 Diciembre 2014, 00:10 AM
He probado todo ya, y no se que puede pasar, incluso he diseñado un allocator para estos tipos pero da el mismo resultado... ¿QUE PUEDO HACER?

Podes:
Depurar tu codigo con WinDbg ayudado por Application Verifier
Subir un minidump del crash - y de paso el PDB - para que lo depure otro usuario
Reducir el problema a la minima expresion compilable (y reproducible) y publicarlo para que otro usuario lo depure

Lo que NO podes hacer es abrir otro hilo para el mismo problema.
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón