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:
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() {};
};
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
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
	}
}
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
 
{
	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
	...
}
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.
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.