读取二进制文件时潜在的内存泄漏

问题描述

我想问一下这部分代码是否可能会出现内存泄漏(我很确定确实如此,但有多严重?)。

“input”变量是一个指向double的指针,即double* input。我没有使用 float(在这种情况下更兼容)的原因是因为我想保持与代码其他部分的兼容性。

else if (filetype == "BinaryFile")
{
    char* memblock;
    std::ifstream file(filename1,std::ios::binary | std::ios::in);
    file.seekg(0,std::ios::end);
    int size = file.tellg();
    file.seekg(0,std::ios::beg);
    std::cout << "Size=" << size << " [in bytes]"
              << "\n";
    std::cout << "There are overall " << grid_points << "^3 = " << std::setprecision(10) << pow(grid_points,3) << " values of the field1,written as float type.\n";
    memblock = new char[size];
    file.seekg(0,std::ios::beg);
    file.read(memblock,size);
    file.close();
    float* values = (float*)memblock; //reinterpret as float,because the file was saved as float
    for (int i = 0; i < grid_points * grid_points * grid_points; i++) {
        input1[i] = (double)values[i]; //cast to double,since input1 is an array of doubles
    }
    file.close();
    delete[] memblock;
}

我需要处理的文件很大,来自宇宙学模拟;例如,一个文件是 4GB,另一个可能是 20GB。出于这个原因,我正在使用超级计算机基础设施。

这种读取适用于具有 512^3 个浮点值的文件(例如,在 512 边的立方体中的点上计算密度),但对于具有 1024^3 个条目的文件会发生内存泄漏。

我曾想我应该删除[]“values”数组,但是当我这样做时,我得到了更严重的内存泄漏,即使在之前所有计算正确的情况下(512^3)也会使我的程序崩溃。

我如何改进此代码?我会使用 std::vector 容器,但我不得不使用 FFTW 库。

编辑:

根据评论中的建议,我将代码的阅读部分改写为:

std::ifstream file(filename1,std::ios::binary);
std::vector<float> buf(pow(grid_points,3));
file.read(reinterpret_cast<char*>(buf.data()),buf.size()*sizeof(float)); 
std::copy_n(buf.begin(),pow(grid_points,3),input1);

我明确地利用了 input1 数组中有多少元素的知识。现在没有发生内存泄漏。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)