Programación General > C/C++
try y object unwinding
(1/1)
diego.martinez:
Buenas:
estoy teniendo un problema con el object unwinding
tengo una seccion __try __except
que usa EHsc para hacer el StackWalk.
Todo ha ido siempre bien, pero hoy he descubierto que tiene problemas con el polimorfismo.
si hago:
--- Código: C++ --- class CA{public: CA() {} virtual ~CA(){}}; class CB : public CA{public: CB() {} ~CB(){}}; int WINAPI WinMain(HINSTANCE hinstance, HINSTANCE hprevinst, LPSTR cmdline, int cmdshow){ __try { CA * a=new CB(); //aqui me da el fallo } __except (ExpFilter("principal",GetExceptionInformation(), GetExceptionCode(),__LINE__,__FUNCTION__)){} return 0;} long _stdcall ExpFilter(char *Message,EXCEPTION_POINTERS* pExp, DWORD dwExpCode,int line,char * func){ GStackWalk sw; [...] //stack walk code return EXCEPTION_EXECUTE_HANDLER; //esto hace que acepte la excepcion , si devolvemos 0 , la gestiona windows}
al ser CB una clase polimorfica me tira el error:
Cannot use __try in functions that require object unwinding
compilo con la opcion /EHsc para activar las excepciones estructuradas de windows, lo que hace que no pueda resolver este caso. (cualquier otro lo hace bien)
Alguien puede explicarme que ocurre?
y que es exactamente el unwinding?
gracias por adelantado :good:
Eternal Idol:
http://msdn.microsoft.com/en-us/library ... 80%29.aspx
http://msdn.microsoft.com/en-us/library ... 80%29.aspx
http://www.learncpp.com/cpp-tutorial/15 ... unwinding/
http://publib.boulder.ibm.com/infocente ... plr155.htm
Recomendacion, no lanzar excepciones en un constructor de esa manera podrias utilizar SEH en esa funcion usando (obviamente no capturaria nada del constructor pero si de otros miembros por ejempl):
__declspec(nothrow)
Otra recomendacion seria NO usar excepciones salvo en casos EXCEPCIONALES (valga la redundancia), todo lo demas es preferible manejarlo con valores de retorno ...
diego.martinez:
gracias! ahora entiendo mejor cual es el problema.
La solución que he puesto es meterlo todo en una funcion a parte.
Esto hace que pueda hacer mejor el unwinding y no me da el fallo, manteniendo la funcionalidad que queria.
nos vemos!
PD: realmente no uso nunca excepciones. Siempre verifico los returns. Lo que tengo es un try catch global en cada hilo, para que si se da una excepcion que no haya tenido en cuenta (buffer overrun, un paseo por un puntero nulo...) la capture el StackWalker y me traze el fallo hasta la función.
Eternal Idol:
De nadas B)
Navegación
Ir a la versión completa