2017-09-26 25 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」工具 - 它傾向於指出發生內存泄漏的確切位置。