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):
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:
(.cpp) en la dll:
La aplicacion que uso para testear las librerias tiene la siguiente pinta:
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:
por este:
y este:
por este:
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?
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?