Проблемы памяти в программировании на Си.Помогите мне найти, какие указатели я не освободил - PullRequest
0 голосов
/ 22 февраля 2019
double criterion(double *para)
{   
int k,i,j,col,t,s;
double shock[2],noise[5],*par,**DATA_SIM,C;
par = (double *) malloc (200*(sizeof(double)));


//Standard deviation Factors
par[0]=exp(para[0]);par[1]=exp(para[1]);

// Firt Measurement
par[3]=para[2];par[4]=1;par[5]=exp(para[3]);

// Second Measurement
par[6]=para[4];par[7]=para[5];par[8]=exp(para[6]);

//Choice Equation
par[11]=para[7];par[12]=para[8];par[13]=para[9];par[14]=para[10];

//Wage Parameters

//profile for HS
par[15]=para[11];par[16]=para[12];par[17]=para[13];

//profile for College
par[18]=para[14];par[19]=para[15];par[20]=para[16];

//First Factor
par[21]=para[17];par[22]=para[18];

//Second Factor
par[23]=1;par[24]=para[19];

//Standard deviation ME
par[25]=exp(para[20]);par[26]=exp(para[21]);


DATA_SIM = (double **) malloc(size_i*size_time*size_sim * sizeof(double *)); for (i = 0; i < size_i*size_time*size_sim; ++i) DATA_SIM[i] = (double *) malloc (size_n*(sizeof(double)));



*seed=-29;


for(s=0;s<size_sim;s++)
    {

    for(k=0;k<size_i;k++)
        {
        //Generate all Random Variables
        for(i=0;i<2;i++)shock[i]=par[i]*normrdn(seed);
        for(i=0;i<5;i++)noise[i]=normrdn(seed);


        //id
        for(t=0;t<size_time;t++)DATA_SIM[size_i*size_time*s+k*size_time+t][0]=k;
        //time
        for(t=0;t<size_time;t++)DATA_SIM[size_i*size_time*s+k*size_time+t][1]=t;

        //Measure 1
        for(t=0;t<size_time;t++)DATA_SIM[size_i*size_time*s+k*size_time+t][2]=par[3]+par[4]*shock[0]    +par[5]*noise[0];
        //Measure 2
        for(t=0;t<size_time;t++)DATA_SIM[size_i*size_time*s+k*size_time+t][3]=par[6]+par[7]*shock[0]    +par[8]*noise[1];

        //Instrument
        for(t=0;t<size_time;t++)DATA_SIM[size_i*size_time*s+k*size_time+t][4]=DATA[k*size_time+t][4];

        //Choice
        if(par[11]+par[12]*shock[0]+par[13]*shock[1]+par[14]*DATA_SIM[size_i*size_time*s+k*size_time][4]+noise[3]>0)        col=1;
        else                                                                                                                col=0;
        for(t=0;t<size_time;t++)DATA_SIM[size_i*size_time*s+k*size_time+t][5]=col;

        // wage
        if(col==0)for(t=0;t<size_time;t++)DATA_SIM[size_i*size_time*s+k*size_time+t][6]=par[15]+par[16]*(t+0.0)+par[17]*(t+0.0)*(t+0.0)+par[21]*shock[0]+par[23]*shock[1]+par[25]*normrdn(seed);
        if(col==1)for(t=0;t<size_time;t++)DATA_SIM[size_i*size_time*s+k*size_time+t][6]=par[18]+par[19]*(t+0.0)+par[20]*(t+0.0)*(t+0.0)+par[22]*shock[0]+par[24]*shock[1]+par[26]*normrdn(seed);


        }
    }


    double *Y,**X,*beta,*epsilon,var;
    epsilon = (double *) malloc (size_i*size_time*size_sim*(sizeof(double)));
    Y = (double *) malloc (size_i*size_time*size_sim*(sizeof(double)));
    beta = (double *) malloc (100*(sizeof(double)));
    X = (double **) malloc(size_i*size_time*size_sim * sizeof(double *)); for (i = 0; i < size_i*size_time*size_sim; ++i) X[i] = (double *) malloc (20*(sizeof(double)));


    for(i=0;i<size_i*size_time*size_sim;i++)
        {
        Y[i]=DATA_SIM[i][6];

        X[i][0]=1;
        //college
        X[i][1]=DATA_SIM[i][5];
        //experience
        X[i][2]=DATA_SIM[i][1];
        //experience squared
        X[i][3]=DATA_SIM[i][1]*DATA_SIM[i][1];
        //experience college
        X[i][4]=DATA_SIM[i][1]*DATA_SIM[i][5];
        //experience squared college
        X[i][5]=DATA_SIM[i][1]*DATA_SIM[i][1]*DATA_SIM[i][5];
        //measurement
        X[i][6]=DATA_SIM[i][2];
        }

    regression(Y,X,size_time*size_i*size_sim,7,beta);

    for(i=0;i<size_i*size_time*size_sim;i++) epsilon[i]=Y[i]-beta[0]-beta[1]*X[i][1]-beta[2]*X[i][2]-beta[3]*X[i][3]-beta[4]*X[i][4]-beta[5]*X[i][15]-beta[6]*X[i][6];

    var=0;for(i=0;i<size_i*size_time*size_sim;i++)var+=epsilon[i]*epsilon[i];var=var/(size_i*size_time*size_sim);

    C=0;for(i=0;i<7;i++){C+=sqr(beta[i]-BETA[i]);}C+=sqr(var-BETA[7]);

    return C;


for(i=0;i<size_i*size_time*size_sim;++i){free(DATA_SIM[i]);free(X[i]);}free(DATA_SIM);free(X);
free(par);  free(beta);free(Y);free(epsilon);
}

Я просто многократно повторяю эту функцию и вижу, что занимаемая память быстро растет.Должен быть какой-то указатель или переменные, которые я не освободил.Может кто-нибудь помочь мне в этом вопросе.Эта программа просто вводит параметры и моделирует DATA_SIM, а также выполняет одну регрессию для этого набора данных.size_sim = 10, size_i = 10000, size_time = 10. * +1002 *

1 Ответ

0 голосов
/ 22 февраля 2019

Есть ли опечатка, или return C; действительно перед звонками на free?Я не уверен, как компилятор позволяет это, не генерируя хотя бы предупреждение.Как написано, код для освобождения объектов, который находится после оператора return, никогда не запустится.

This:

C=0;for(i=0;i<7;i++){C+=sqr(beta[i]-BETA[i]);}C+=sqr(var-BETA[7]);
return C;

for(i=0;i<size_i*size_time*size_sim;++i){free(DATA_SIM[i]);free(X[i]);}free(DATA_SIM);free(X);
free(par);  free(beta);free(Y);free(epsilon);
...