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 :
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
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; }
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 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; }
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...
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; }
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.
Partager