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
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
Miclase::Miclase() { str = string("prueba"); } Miclase::~Miclase() { }
La aplicacion que uso para testear las librerias tiene la siguiente pinta:
Código
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
por este:
string str;
Código
string *str;
y este:
Código
por este:
str = string("prueba");
Código
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?