No es este código:gestor de excepciones
char text[] = "zim";
int x = 777;
Si miro en la pila donde x y el texto se colocan allí salida es:
09 03 00 00 7a 69 6d 00
Dónde:
- 09 03 00 00 = 0x309 = 777 < - int x = 777
- 7a 69 6d 00 = texto de caracteres [] = "zim" (código ASCII)
No es ahora de código con try..catch:
char text[] = "zim";
try{
int x = 777;
}
catch(int){
}
Pila:
09 03 00 00 **97 85 04 08** 7a 69 6d 00
Ahora entre texto y x se coloca nuevo valor de 4 bytes. Si agrego otro catch, entonces habrá algo así como:
09 03 00 00 **97 85 04 08** **xx xx xx xx** 7a 69 6d 00
y así sucesivamente. Creo que este es un valor relacionado con el manejo de excepciones y se usa durante el desenrollado de la pila para encontrar la captura adecuada cuando se lanza la excepción en el bloque try. Sin embargo, la pregunta es, ¿qué es exactamente este valor de 4 bytes (tal vez alguna dirección para la estructura del manejador de excepciones o alguna identificación)?
Uso g ++ 4.6 en la máquina Linux de 32 bits.
Ver [C++ try/throw/catch => código de máquina] (http://stackoverflow.com/questions/1331220/c-try-throw-catch-machine-code), que apunta a http: // www .codeproject.com/Articles/2126/How-aC-compiler-implements-exception-handling –
¿Por qué quieres saberlo? Incluso si le diéramos una respuesta, sería específico del compilador y de esa versión específica del compilador. Entonces, técnicamente no es una pregunta de C++. Es una pregunta sobre g ++ y cómo funciona. Que a menos que realmente te interese escribir extensiones para g ++ es un conocimiento completamente inútil. –
@LokiAstari: g ++ y otros compiladores de C++ para * nix usan el [Itanium ABI] (http://sourcery.mentor.com/public/cxx-abi/abi-eh.html) en la mayoría de las plataformas (con algunas modificaciones que dependen de la plataforma), así que no es * esa * plataforma/compilador específico. Y aún así, es interesante saber cómo se puede implementar la maquinaria de manejo de excepciones. –