2013-05-03 2 views
0

초보자 인 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; 
} 
+1

'더블 * 결과 : 당신이 "새로운"당신이 (자바와 같은 가비지 컬렉션과 언어 반대) C++에, 당신이 자신을 무료로 다시 쿼리되는 메모리를 할당하고 사용하고 때마다 double [2 * N];'내가 볼 수있는 것에서'sum_vector'에서 반환 된이 메모리를 삭제하지 마십시오. 당신은 다른 것을 삭제하지 않습니다. –

답변

1
+0

물론 다른 대답은 * 명시 적으로 * new를 사용하지 않고 대신 std :: vector를 사용하여 메모리를 확보하십시오. – john

+0

감사합니다. 나는 @john의 조언을 따르고 std :: vector에 갔다. 왜냐하면 이제는 대구가 메모리를 소비하지 않지만 여전히 몇 가지 문제가있다.) std :: vector & std :: vector 의 차이점은 무엇인가? * 나는 첫 번째 것을 사용해야했지만 그 이유는 모른다. 두번째) 함수'CCJJDC'는'sum_vector' 함수의 출력을 입력으로하고 싶지 않습니다. –

+0

@zumazuma 첫 번째는 참조이고, secocd는 포인터지만, ** way **는 너무 커야 SO에 대한 의견 섹션. 그러나 당신이 올바른 선택을했다고 생각합니다. 수정 된 코드를 보지 않고 두 번째 질문에 대답 할 수 없습니다. – john

관련 문제