分配和初始化大内存空间



我有一个函数如下:

float* Alocate2DBlankMemoryContinousSpace(int w, int h)
{
    float *matrix = (float*)malloc(w*h*sizeof(float));
    for (int i = 0; i<w*h; i++)
        matrix[i] = 0.0;
    return matrix;
}

表示二维中的分配向量。对于像w=1000和h=1000这样的小向量,它是正确工作的,但对于更大的向量,存在内存访问违反写入位置的问题,事实上,我有很多空闲内存要写入。如何分配和初始化大空间在连续内存?

1000x1000 float(32位)缓冲区将使用4,000,000字节(3.8MiB),应该可以正常运行。我很好奇什么值对你来说失败了,也许10000x10000会失败,因为那将是一个381MiB大小的缓冲区,如果你在一个32位进程中运行,我可以看到如果你调用你的函数3次或更多次,你可能会耗尽空间。

无论如何,你的代码中有一些坏习惯,首先是你没有检查分配是否成功,然后你在calloc可能更快的时候将自己的内存归零。如果分配失败,malloc将返回NULL,但当您自己将内存归零时,您仍然对指针进行解引用。

这样做:

float* matrix = calloc( width * height, sizeof(float) );
if( matrix == NULL ) exit(1); // Bad-allocation, either terminate or fail gracefully and inform the user of the condition.
return matrix;

相关内容

  • 没有找到相关文章

最新更新