Je vais donner ma réponse à partir d'un programmation compétitive (pc) mais elle s'applique également à d'autres domaines.
Souvent, en faisant un cp, les contraintes sont assez grandes.
Par exemple : J'avais une question avec une variable N, M, Q
tal que 1 ≤ N, M, Q < 10^5
.
L'erreur que j'ai commise était de déclarer un tableau d'entiers 2D de taille 10000 x 10000
en C++
et a lutté avec le SIGABRT
erreur au Codechef depuis presque 2 jours.
Maintenant, si nous calculons :
Taille typique d'un entier : 4 octets
Nombre de cellules dans notre tableau : 10000 x 10000
Taille totale (en octets) : 400000000 octets = 4*10^8 ≈ 400 MB
Vos solutions à ces questions fonctionneront sur votre PC (pas toujours) car il peut supporter cette taille.
Mais les ressources des sites de codage (juges en ligne) sont limitées à quelques Ko.
Par conséquent, le SIGABRT
et d'autres erreurs de ce type.
Conclusion :
Dans de telles questions, nous ne devrions pas déclarer un tableau ou un vecteur ou tout autre DS de cette taille, mais notre tâche est de rendre notre algorithme si efficace qu'il fonctionne sans eux (DS) ou avec moins de mémoire.
PS : Il peut y avoir d'autres raisons à cette erreur ; la raison ci-dessus en est une.
7 votes
Il y a plusieurs façons de procéder. La plus simple, si vous avez écrit le programme, est d'enregistrer un gestionnaire de signal pour SIGABRT qui imprime cette information et vide ses flux avant de revenir. La deuxième façon la plus simple est d'exécuter le programme dans strace. Le troisième moyen le plus simple est de s'assurer que le programme génère un fichier core lorsqu'il se plante, et de le découvrir via le core dump.