2017-09-26 7 views
-2

이 함수를 여러 번 호출하여 파일을 여러 번 인쇄 할 때 메모리 누수가 계속 발생합니다. 실제로 인쇄하지 않으면 문제가 없습니다.함수를 여러 번 호출하여 파일을 여러 번 인쇄 할 때 메모리 누수가 발생합니다.

void print_fields_weights_energies(MKL_Complex16 *stored_fields, 
            MKL_Complex16 *stored_energies, 
            MKL_Complex16 *weights, 
            int steps, 
            int_st ist, 
            cns_st cns) { 

    /*Print The Fields Out To File*/ 
    int walkers; 
    int fields; 
    int field_number; 
    double tau = steps*cns.dtau; 
    char message[150]; 
    FILE *pf; 

    /*Name and Make File*/ 
    sprintf(message, "fields-tau%f.dat", tau); 
    pf = fopen(message, "w+"); 

    for (walkers=0; walkers<cns.max_number_walkers; walkers++) { 
    for (fields=0; fields<ist.n_spin_orbitals_sq; fields++) { 
     field_number = walkers*ist.n_spin_orbitals_sq*3+fields*3; 
     fprintf(pf, "%f\t %d\t %d\t", tau, walkers, fields); 
     fprintf(pf, "%f\t %f\t %f\t %f+%fi\t\t", stored_energies[walkers*3].real, stored_energies[walkers*3+1].real, stored_energies[walkers*3+2].real, weights[walkers].real, weights[walkers].imag); 
     fprintf(pf, "%f\t %f+%fi\t %f+%fi\n", stored_fields[field_number].real, stored_fields[field_number+1].real, stored_fields[field_number+1].imag, stored_fields[field_number+2].real, stored_fields[field_number+2].imag); 
     } 
    } 
    fflush(pf); 
    return; 
} 
+4

'fclose'를 절대로 호출하지 않습니까? – AndyG

+0

태그가 잘못되었습니다. 그것은 C.로 쓰여졌습니다 – JY078

+0

예. 나는 fclose를 호출했다. – JY078

답변

2

당신은 함수의 바닥에서 FCLOSE을()가 필요합니다 (당신은 FFLUSH()이 필요하지 않습니다 -이 폐쇄됩니다 때 파일이 플러시됩니다).

또한 fopen()에 오류가 발생하면 참조하기 전에 (pf == NULL)을 확인해야합니다. 오류 메시지를받는 것이 SEGV를받는 것보다 훨씬 유용합니다.

향후 메모리 누수가 발생할 경우, "valgrind"도구를 사용하는 것이 좋습니다. 이는 메모리 누수가 발생한 지점을 정확히 가리키는 경향이 있습니다.