std::bad_alloc, impossible de savoir d'où il vient.

std::bad_alloc, impossible de savoir d'où il vient. - C++ - Programmation

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 :
 

Citation :

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!

Reply

Marsh Posté le 04-12-2007 à 22:34:54   

Reply

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).

Reply

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...

Reply

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.

Reply

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.

Reply

Marsh Posté le 05-12-2007 à 09:59:11    

bah char*, commente AjouterOccurence(), a tous les coups l'exception va partir :D
 
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<>.


Message édité par bjone le 05-12-2007 à 10:00:23
Reply

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!

Reply

Marsh Posté le 05-12-2007 à 12:48:02    

vire ces char*

Reply

Marsh Posté le 05-12-2007 à 12:48:35    

(*it2).size()==mot.size()){
                        if (*it2==mot)  
 
optimisation foireuse et inutile

Reply

Marsh 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.


---------------
deluser --remove-home ptitchep
Reply

Marsh Posté le 05-12-2007 à 17:00:15   

Reply

Marsh Posté le 05-12-2007 à 23:18:22    

Taz a écrit :

(*it2).size()==mot.size()){
                        if (*it2==mot)

 

optimisation foireuse et inutile

 

Pas du tout inutile, elle me fait gagner 1,5s sur un fichier de 10 Mo :p

 

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 :)

Message cité 1 fois
Message édité par moystard le 05-12-2007 à 23:21:26
Reply

Marsh Posté le 06-12-2007 à 01:12:24    

moystard a écrit :


 
Pas du tout inutile, elle me fait gagner 1,5s sur un fichier de 10 Mo :p
 


 
en principe ça devrait pas être le cas, mais bon c'est suivant l'implémentation :/

Reply

Marsh Posté le 08-12-2007 à 21:46:12    

bjone a écrit :


 
en principe ça devrait pas être le cas, mais bon c'est suivant l'implémentation :/


J'envisage pas une implémentation de ce genre, je pense que le problème n'est pas là.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed