2013-05-03 76 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