Que fait l'erreur d'exécution suivant signifie: “mettre fin à appelé en l'absence d'une exception\n Avorté”
Le bug m'a dérangé sur deux jours: lors de l'exécution du code j'ai une erreur d'exécution de "mettre fin à appelé en l'absence d'une exception\n Avorté",pourquoi?
J'ai essayer de trouver le code et trouver la ligne est peut-être quitter le code "xx = new int [num]", le num dans mon cas de test est d'environ 640000(64MO de mémoire pour les nouveaux). lorsque j'ai mis le num beaucoup plus petit que 10, c'est OK, mais mon code une fausse réponse cette fois-ci.
J'ai essayer de supprimer tous les "try/catch" Clause mais toujours cette erreur.
Aussi j' //toutes les fonctions qui appellent le "xx = new int [num]" clause, l'erreur existent encore, et cette fois, j'ai trouver le code peut quitter la est un de normal "pour la boucle".
Tous les cas, passé le compilateur, ont u jamais rencontré cette erreur dans l'exécution de votre code?Merci!!!!
J' //supprimer l'article et obtenez le message d'erreur ci-dessous:
* glibc détecté * ./ESMF_RegridWeightGen: munmap_chunk(): pointeur non valide: 0x00000000005cd376 *
try/catch
bloc autour de l'ensemble de votre main
corps et de voir si il y a des exceptions à toutes les...Avez-vous un petit exemple de code qui illustre le problème?
avez-vous plusieurs threads?
Oh, pas du tout~
chillyc.info/?s=terminate appelé++sans+une+active+exception vous voyez que c'est... vide jeter. par exemple: jeter;
OriginalL'auteur xunzhang | 2011-11-12
Vous devez vous connecter pour publier un commentaire.
Quand j'ai vu cette erreur, elle a été causée par le thread de l'objet détruit avant de l'enfiler encapsulé a quitté.
std::thread foo(...)
dans un bloc local, et de lever une exception après le démarrage du thread. Avant votre exception est interceptée, le fil destructeur qui se passe, et il appellestd::terminate()
, ce qui le rend difficile à déboguer le véritable exception!OriginalL'auteur Gearoid Murphy
Je l'ai rencontré quand j'ai essayé d'utiliser le jeter; en dehors d'une clause catch. Le renvoyer échoue et que le message d'erreur est affiché.
OriginalL'auteur adsf
Le "mettre fin à l'absence d'une exception de message" est une allusion au fait que, à un certain moment dans votre programme, la gestion des exceptions s'est cassé.
L'allocation de mémoire est probablement la cause principale, mais probablement pas l'erreur de site. La grande allocation de jeter un std::bad_alloc exception, et cette exception est pas correctement traitée quelque part.
Pour valider la théorie, insérer une ligne comme
au-dessus de l'allocation, ce qui devrait déclencher le bug.
J'ai rencontré deux raisons à cela:
Vous devriez être en mesure de diagnostiquer cette condition avec un débogueur. Une trace de la pile de votre demande (par exemple, obtenu en l'exécutant dans gdb) devraient aider grandement.
La dernière fois que j'ai vérifié, sizeof(int) < 10, de sorte que 640 000 * sizeof(int) < de 6.400.000 < 6,4 MO. Il pourrait être trop large et pourrait jeter un std::bad_alloc. Ce qui devrait se traduire, au pire, de mettre fin à un appel qui imprime std::bad_alloc, pas à "mettre fin à appelé en l'absence d'une exception". Il y a de pire qu'un problème quelque part, et sa trop grande allocation est juste déclenchement.
oui, vous avez raison
OriginalL'auteur thiton
Comme Gearoid Murphy dit que l'erreur se produit lorsque l'objet thread est détruit avant que la fonction de thread lui-même a été entièrement exécutée. J'ai détecté cette erreur à l'aide de tinythread bibliothèque (http://tinythreadpp.bitsnbites.eu/):
Avant:
Après:
OriginalL'auteur Akseli Palén
Avec MinGW, l'ajout de la
-mthreads
option de compilation de gcc permet de résoudre ce problème.De le manuel de gcc:
OriginalL'auteur Riot