Я новичок в C ++, я написал этот код для некоторых физических проблем, но этот код при запуске очень быстро потребляет память. Основная идея заключается в том, что я хочу, чтобы функция CCJJ принимала массивы x и I_noise и A один раз, поэтому я не хочу передавать их элемент за элементом.
Я не уверен, что правильно управляю массивом. Так может ли кто-нибудь сказать мне, где находится то, что потребляет память и как я могу это исправить?
Спасибо,
#include "CCJJDC_system.h"double *sum_vector(double *a,double *b,double fact){
double *result=new double[2*N];
for(int i=0;i<2*N;i++)
result[i]=a[i]+b[i]*fact;
return result;
}
int main(){
FILE *f;f=fopen("x.dat","w");
double *x=new double[2*N], t, I_noise[N], I=0;
//Matrix A as descrip in the paper
//method to dinamicaly allocat the array
typedef double (A_t)[N];
A_t *A = new A_t[N];
//end of the method
//auto A=new double[N][N];
for(int i=0;i<N-1;i++){
A[i][i] = 1.0 + 2.0*alpha;
A[i+1][i] = -alpha;
A[i][i+1] = -alpha;
}
A[N-1][N-1] = 1.0 + 2.0*alpha;
A[0][N-1] = -alpha;
A[N-1][0] = -alpha;
//end of matrix A creation
//Noise creation
for(int i=0;i<N;i++)
I_noise[i]=0;
//Initinal condtion for \phi and V
for(int i=0;i<2*N;i++)
x[i]=0;
double
t_max=500,
t_min=0,
h=0.1,
*k1=new double[2*N],
*k2=new double[2*N],
*k3=new double[2*N],
*k4=new double[2*N];
double
I_0=0.0,
I_max=1.0,
dI=0.001;
for(I=I_0;I<I_max;I+=dI){
for(t=t_min;t<t_max;t=t+h){
k1=CCJJDC(x,t,I_noise,I,A);
k2=CCJJDC(sum_vector(x,k1,h/2),t,I_noise,I,A);
k3=CCJJDC(sum_vector(x,k2,h/2),t,I_noise,I,A);
k4=CCJJDC(sum_vector(x,k3,h),t,I_noise,I,A);
for(int i=0;i<2*N;i++)
x[i]=x[i]+(k1[i]+(2*k2[i])+(2*k3[i])+k4[i])*h/6;
}
double V=0;
for(int i=0;i<N;i++)
V+=x[i];
std::cout<<"I: "<<I<<"\t V: "<<V<<std::endl;
fprintf(f,"%f\t",I);
fprintf(f,"%f\t",V);
fprintf(f,"\n");
fflush(f);
}
std::cout<<"finish"<<std::endl;
fclose(f);
return 0;
}
и это моя функция CCJJ
double *CCJJDC(double *x,double t,double *I_noise,double I,double (*A)[N]){
double *xn;
xn=x;
//double
//*result=new double[2*N],
//I_noise[N],
//x[2*N],
//dx[2*N];
for(int i=0;i<N;i++){
for(int j=0;j<N;j++){
x[j]+=A[i][j]*xn[j+N];
}
x[i+N]=I-sin(xn[i])-beta*x[i]+Amp*sin(Omega*t)+I_noise[i];
}
return x;
}
Вы должны прочитать о распределении памяти. Каждый раз, когда вы используете «new», вы выделяете память, которая в C ++ требует от вас освобождения (в отличие от языков с сборкой мусора, таких как Java):
Других решений пока нет …