我是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;
}
'雙*結果=新:你用「新」的你分配內存,在C++中,你重新查詢釋放自己(而不是語言與垃圾收集如Java)每次double [2 * N];'你從不刪除從'sum_vector'返回的內存,我從中可以看到。你也不會刪除其他東西。 – 2013-05-03 09:22:17