résilier appelé après avoir jeté une instance de 'std::string'
J'ai cette binaires, c'est de s'écraser par la levée d'une exception de type std:string.
Trace de pile d'une dépouillé binaire:
terminate called after throwing an instance of 'std::string'
*** Aborted at 1309483487 (unix time) try "date -d @1309483487" if you are using GNU date ***
PC: @ 0x3fb0c30155 (unknown)
*** SIGABRT (@0xd54) received by PID 3412 (TID 0x40d03940) from PID 3412; stack trace: ***
@ 0x3fb180de70 (unknown)
@ 0x3fb0c30155 (unknown)
@ 0x3fb0c31bf0 (unknown)
@ 0x2aaaaab80cc4 (unknown)
@ 0x2aaaaab7ee36 (unknown)
@ 0x2aaaaab7ee63 (unknown)
@ 0x2aaaaab7ef4a (unknown)
@ 0x4c2622 XYZ::connect()
@ 0x4c3e0f XYZ::refresh()
@ 0x3fb18062f7 (unknown)
@ 0x3fb0cd1e3d (unknown)
Maintenant, la chose est, le refresh() la fonction ne essayez d'attraper std::string. Il ressemble à:-
bool XYZ::refresh() {
try {
connect();
} catch (string& s) {
return false;
}
return true;
}
Aucune idée pourquoi n'est-il pas de se faire prendre? Ou Suis-je à la lecture de la trace de la pile de mal?
- Je voudrais essayer d'attraper un
const string&
.
Vous devez vous connecter pour publier un commentaire.
Peut-être que certains ou tous les modules sont compilés avec
-fno-exceptions
? Voir http://gcc.gnu.org/onlinedocs/libstdc++/manual/using_exceptions.html pour plus de détails sur la façon dont les changements de comportement des exceptions.Par exemple, le programme court affiche
"terminate called after throwing an instance of 'std::string'"
si:foo()
a été compilé avec-fno-exceptions
, etfoo()
appelle quelque chose qui lève une exception de typestd::string
(tous les autres modules sont compilés avec-fexceptions
)Noter que, si je recompile
foo.cpp
avec -fexceptions (g++'s par défaut) et relier, le programme affiche:comme prévu.
Ou peut-être des intermédiaires de la fonction a un jet de spécification qui n'a pas de liste
std::string
?Par exemple, ce programme:
Affiche également de "mettre fin a appelé après avoir jeté une instance de 'std::string'". Deux exemples ont été testés sur une zone de Windows avec MinGW 4.5.1.
Que devrait être bon.
Peut-être vous n'avez pas de reconstruire tous vos fichiers source, ou vous êtes en cours d'exécution out-of-date exécutable.