Bonjour,
Je cherche desesperemment à debugger un crash inexpliqué avec l'algo sort() de la STL. Ca fait 2 jours que je suis dessus, et je craque...
Outils: code::blocks avec mingw
Le contexte (je ne met que ce qui est pertinent dans les classes):
J'ai une classe (CRule) qui contient un conteneur "map", plus d'autres trucs (dont un Id unique, assigné par incrémentation d'une variable statique dans tous les contructeurs. Cet Id n'a de rôle que en phase "debug")
Cette classe est utilisée dans une autre, sous la forme d'un "vector":
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 class CRule { private: std::map<uchar, uchar> set; uint Id; };
L'allocation est faite en dynamique de façon tout à fait classique dans le constructeur de cette classe:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 class CRuleBase { private: std::vector<CRule>* rule_set; }
(c'est fait en dynamique, parce qu'il y a un traitement qui extrait de la liste principale une liste constituée des éléments pertinents, et ceci se fait en allouant et remplissant un nouveau vector, puis en faisant un delete de l'ancien, puis en assignant le pointeur sur le nouveau vector)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 CRuleBase::CRuleBase() { rule_set = new vector<CRule>; }
J'ai une méthode de tri, qui ne fait qu'appeler le "sort()":
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 void CRuleBase::Sort() { cerr << "Nb Elem = "<<distance(rule_set->begin(), rule_set->end() )<<endl; sort( rule_set->begin(), rule_set->end() ); }
Or, quand je veux trier ce vecteur, pour 1000 élements: aucun problème, mais si je passe à 1500, j'ai un crash (SIGSEGV, segmentation fault, me dit gdb)
J'ai tracé l'utilisation de mon opérateur "<" de CRule (affichage de l'Id de chaque CRule manipulé, et de son contenu), et j'observe des comportements incohérents avant le crash: genre, après une série de comparaison normales, on a d'un coup 549 comparaisons successives identiques entre le CRule N°0 (1-qui n'existe pas, j'ai la trace de sa destruction !, 2-qui est vide), et l'objet CRule n°5894 (qui lui est tout à fait cohérent)
Bref, tout ça ressemble fort à de la corruption mémoire, mais je ne vois vraiment pas où est mon erreur... Y a-t-il des précautions particulières à prendre avec sort() ? Dois-je utiliser un mécanisme d'allocation mémoire particulier? Là, je suis un peu coincé, je ne me vois pas trop comment aller fouiller dans la fonction sort()...
Ou alors un problème d'allocation méméoire ? Mais c'est normalement géré de façon automatique, non ? Comment depister un tel problème ?
Merci d'avance pour vos conseils et idées !
Partager