std::bad_alloc, impossible de savoir d'où il vient. - C++ - Programmation
Marsh Posté le 04-12-2007 à 22:45:46
Salut,
moystard a écrit : En mettant des cout dans mon programme, j'ai découvert que le fautif est dans dans cette méthode : |
Tu voudrais pas plutôt utiliser un debuggeur? Tu en apprendras beaucoup plus sur le pourquoi du comment.
Il serait aussi utile d'utiliser des passages par référence que par copie (fichierAnalyse, et peut-être d'autres).
Marsh Posté le 04-12-2007 à 22:55:37
C'est la où j'ai une lacune. Mon programme doit être exécuté avec des parametres (fichiers à analyser entre autre), et je trouve pas dans kdevelop la possibilité de débugger en lançant le main avec des paramètres...
Marsh Posté le 05-12-2007 à 01:45:18
Je peux pas t'aider sur le passage de paramètres avec KDevelop, mais tu peux sans doute "construire" des valeurs représentatives (au pire), et les utiliser à l'identique.
Marsh Posté le 05-12-2007 à 01:52:59
Jette un oeil à Electric Fence (la librairie) et gdb (le debuggeur).
On ne peut pas plus t'aider que ça ne connaissant pas le contenu des methodes appelées par la méthode suspecte. Mais déjà avec les deux noms donnés précédemment, tu devrais trouver quelque chose.
Marsh Posté le 05-12-2007 à 09:59:11
bah char*, commente AjouterOccurence(), a tous les coups l'exception va partir
si tu utilisais set<> pour tes mots clés, ce serait plus efficace de faire une recherche avec un find(), que de comparer séquentiellement un vector<>.
Marsh Posté le 05-12-2007 à 12:40:05
merci pour vos infos, j'ai découvert le bug en question à 3h du matin... et j'ai réussi à le corriger. Il était dans la méthode qui lit chaque mot Merci à vous!
Marsh Posté le 05-12-2007 à 12:48:35
ReplyMarsh Posté le 05-12-2007 à 17:00:15
Pour debugger, j'utilise kdbg (qui utilise gdb je crois). je le trouve pas mal et tu peux choisir les arguments envoyés à ton prog.
Marsh Posté le 05-12-2007 à 23:18:22
Taz a écrit : (*it2).size()==mot.size()){ optimisation foireuse et inutile |
Pas du tout inutile, elle me fait gagner 1,5s sur un fichier de 10 Mo
Et les char * c'est pour iostream qui manipule les noms de fichiers en char * .
ptitchep a écrit : Pour debugger, j'utilise kdbg (qui utilise gdb je crois). je le trouve pas mal et tu peux choisir les arguments envoyés à ton prog. |
Merci beaucoup, je vais tester ça
Marsh Posté le 06-12-2007 à 01:12:24
moystard a écrit : |
en principe ça devrait pas être le cas, mais bon c'est suivant l'implémentation
Marsh Posté le 08-12-2007 à 21:46:12
bjone a écrit : |
J'envisage pas une implémentation de ce genre, je pense que le problème n'est pas là.
Marsh Posté le 04-12-2007 à 22:34:54
Bonsoir tout le monde!
J'ai un problème super urgent. une fois sur cinq quand je lance mon programme sur le même fichier, j'ai un std::bad_alloc. En mettant des cout dans mon programme, j'ai découvert que le fautif est dans dans cette méthode :
void ReferenceCroisee::Remplir (std::vector<char *> fichiersAnalyse, char
*fichierIdentificateurs)
// Algorithme :
// La méthode commence par appeler la méthode LireMotsCles.
// Ensuite, chaque fichier dont le nom est passé en argument de
// la méthode (dans le vector fichiersAnalyse) est exploré.
// Si l'ouverture d'un fichier rencontre une erreur, on la signale à
// l'utilisateur par un message d'erreur, et on passe au fichier suivant.
// Chaque fichier est lu mot à mot. Si le mot correspond à l'un des mots-clés,
// alors l'occurence est enregistrée dans la structure en appelant la méthode
// AjouterOccurence.
//
{
LireMotsCles(fichierIdentificateurs);
for (std::vector<char *>::iterator it = fichiersAnalyse.begin();
it!=fichiersAnalyse.end(); it++)
{
Fichier file(*it);
if ( file.OuvrirFichier())
{
std::string mot;
mot = file.LectureMot();
while ( mot != "" )
{
for (std::vector<std::string>::iterator it2 = motsCles.begin();
it2!=motsCles.end(); it2++)
{
if ((*it2).size()==mot.size()){
if (*it2==mot)
{ AjouterOccurence(mot,*it,file.LigneCourante());
}
}
}
mot = file.LectureMot();
}
}
else
{
std::cout << "ERR : Fichier " << *it <<" non trouvé." << std::endl;
}
}
}
Vous voyez quelque chose qui pourrait produire un bad_alloc?
Merci beaucoup pour votre aide!