Bonjour,
Developpeur dans une grosse compagnie, on m'a demande il y a une semaine d'intervenir sur un logiciel developpe en interne, execute en batch toute les nuits, qui s'est mis subitement a crasher.
Celui-ci a ete developpe en C++ sous Visual Studio, je ne sais quelle version a l'epoque, mais aujourd'hui je le debug sous VS 2003 / windows XP.
J'ai isole la ligne du programme qui genere une exception, mais qui est executee des milliers de fois avant de planter. Cela survient sur l'execution de la methode "insert" sur une multimap.
Voici le code ou est definie ma multimap:
Et voici ou elle est utilisee:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54 #include <map> #include "CDate.h" class CleRef { public : int Type; char Signature[80]; public : CleRef(int aType, long aRef1) { Type=aType; sprintf(Signature,"%ld",aRef1); } ~CleRef() {} bool operator < (const CleRef& cle) const { if (Type==cle.Type) return std::string(Signature) < std::string(cle.Signature); else return Type<cle.Type; } }; class PointRef { public : int Dim; // dimension de l'espace des données double limite; CDate maDate; double valeur; PointRef(int aDim, double aValeur = 0.0) { Dim=aDim; valeur=aValeur; limite=0.0; } PointRef(int aDim, double aValeur, long aDate, double aLimite = 0.0) { Dim=aDim; valeur=aValeur; maDate = CDate(aDate); limite= aLimite;} ~PointRef() {} }; // ************************************************************************************* // Structure d'ensemble de reference a des donnees de marche // ************************************************************************************* class CustomMM : public std::multimap<CleRef, PointRef> { public : CustomMM() {}; ~CustomMM() {}; };
En gros dans le programme on boucle 18000 fois, a chaque iteration on fait ceci (en tres gros resume)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 void MonContext::SauveValeur(long code, double valeur) const { const CleRef cleRef(1, code); PointRef point(0, valeur); CustomMM::value_type value(cleRef, point); try { //La variable _pBuffer a ete initialisee auparavant et pointe vers un objet de type CustomMM _pBuffer->insert(value); } catch (exception ex) { //Affichage message d'erreur } catch (...) { //Affichage message d'erreur } }
Voila je ne sais pas si j'ai ete tres clair mais il n'est pas evident de resume le probleme en un simple post.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 { CustomMM * customMM = new CustomMM(); MonContext * monContext = new MonContext(); monContext->SetBuffer(customMM); for (i=0; i<1000 ; i++) { long currentCode = GetCode(i); //Fonction qui renvoie un code unique a chaque fois long maValeur = GetCurrentValeur(i); //########################## //Ligne qui crashe lors de la 489 nieme iteration sur le 18197 ieme MonContext cree monContext.SauveValeur(currentCode, maValeur); //############################ } //Sauvegarde de monContext dans une map ... }
Je suis aussi conscient de la non-lisibilite du code (ce n'est pas le mien hein je precise ;-) *sifflotte*)
Si je resume le probleme voici ce qui se passe
(boucle 19000 fois)
{
Creation d'une nouvelle multimap via un pointeur (donc allocation memoire)
(boucle 500 fois)
{
Insertion dans la multimap
}
}
==> Ca crashe lors de la 489 ieme insertion dans ma 18197 ieme multimap ! :-(
Tout ce post pour en venir a ma question : je me demandais s'il y avait certaines limites techniques, ou de performances, connues, a la multimap ?
Ou plus generalement, est ce que quelqu'un aurait une idee pour me sortir de ce mauvais pas ?
Merci par avance a la communaute,
Guyzeug.
Partager