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

回答

1

你應該閱讀有關內存分配。

http://en.wikipedia.org/wiki/Delete_(C%2B%2B)

+0

當然其他答案是不*明確*使用新的,而是使用std :: vector來爲你釋放內存。 – john 2013-05-03 09:30:58

+0

謝謝大家。我確實遵循@john的建議,並去了std :: vector,鱈魚現在不像以前那樣消耗內存,但我仍然有一些問題,首先)std :: vector &和std :: vector 之間有什麼區別*我必須使用第一個,但我不知道原因。第二個)函數'CCJJDC'不想把函數'sum_vector'的輸出作爲輸入 – 2013-05-03 11:13:42

+0

@ zumazuma第一個是引用,secocd是一個指針,但這是**方式**太大了,關於SO的評論部分。我認爲你選擇了正確的選擇。如果沒有看到修改後的代碼,則無法回答第二個問題。 – john 2013-05-03 11:45:06