Bonjour,

J'ai un problème de mémoire dans mon programme. VS me renvoie une exception bad_alloc sur la fonction get_Traj() suivante :

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
double * Processus_Ito::get_Traj(double h) const {
    //on simule une trajectoire du processus
    //on renvoie un tableau contenant les points (S_{t_i})
	long N = (long) floor(T/h)+1;
    double * traj = new double[N];
    *SCurr=S0;
    traj[0]=S0;
	double t=0;
    for(int i=0;i<N-1;i++)
    {
		traj[i+1]=traj[i]+(*this).get_Increment(t,h);
        *SCurr=traj[i+1]; 
		t+=DT;
    }
    return traj;
}
Je l'utilise à travers d'autres fonctions :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
double BarrierOption::Simule() const
{
	cout << "Récupération de la trajectoire"<<endl;
	double * traj= S.get_Traj(S.getDT());
	//on regarde si l'actif est sortie du domaine durant la
	//durée de vie de l'option
	int i=0;
	while ((traj[i]>=bg) && (traj[i]<=bd) && (i<S.getN()))
		i++;
	if(i==S.getN())
		return P(traj[S.getN()-1]);
	else
		return 0;
}
et

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
double* Processus::MonteCarlo(long NMC) const{
    double M=0,V=0;
    for(int i=0;i<NMC;i++)
    {
        double real = (*this).Simule();
        M+=real;
        V+=real*real;
    }
    M*=1./NMC;
    double var=1./(NMC-1)*V-NMC*M*M/(NMC-1);
	double rvar=sqrt(var);
    double *ret = new double[4];
    ret[0]=M-rvar*1.96/sqrt((double)NMC);
    ret[1]=M;
    ret[2]=M+rvar*1.96/sqrt((double)NMC);
    ret[3]=var;
    return ret;
}
Quand je prend pour h (paramètre de get_Traj) la valeur 0.01 et pour NMC la valeur 10^7, mon programme calcule la valeur que j'attends. Par contre si je prends h=0.0001 et NMC=100000. L'exception est levée pour i=26669...
Par ailleurs, si j'appelle get_Traj tout seul et que je copie le tableau renvoyé dans un fichier, tout se passe bien même pour h=0.0001.

Auriez-vous une idée de l'origine du problème ? J'ai bien fait attention de détruire tous mes pointeurs dès que je le pouvais et pourquoi ça ne plante pas tous le temps ?

Pour information, la classe Processus_Ito dérive la classe Processus et la classe BarrierOption a un membre S qui est un processus.

Merci d'avance de votre aide.

allced.