초보자 인 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++에, 당신이 자신을 무료로 다시 쿼리되는 메모리를 할당하고 사용하고 때마다 double [2 * N];'내가 볼 수있는 것에서'sum_vector'에서 반환 된이 메모리를 삭제하지 마십시오. 당신은 다른 것을 삭제하지 않습니다. –