通过多次调用函数将多次打印到文件时发生内存泄漏

时间:2017-09-26 17:57:09

标签: c printing memory-leaks printf

当我通过多次调用此函数将多次打印到文件时,我一直在运行内存泄漏。除非我实际打印,否则没有任何问题。

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;
}

1 个答案:

答案 0 :(得分:2)

你的函数底部需要一个fclose()(你不需要fflush() - 文件在关闭时会被刷新)。

如果fopen()发生错误,您还应该在引用它之前检查(pf == NULL)。获取错误消息比获取SEGV更有用。

对于未来的内存泄漏,我强烈推荐使用“valgrind”工具 - 它往往会指向你内存泄漏的确切位置。