如何在C中释放内存



我正在编写的代码中有很多1&二维阵列。我得到了";错误:无法分配区域";我认为这是因为分配了太多内存。我使用";malloc";以及";免费的";函数,但我不确定我是否正确使用了它们。也许你知道我在哪里可以看到C中内存管理的好例子吗?

所以。。我只是想让一个算法工作,现在这个代码只是一个又一个函数。。

//memory allocation for 1D arrays
buffer = malloc(num_items*sizeof(double));
//memory allocation for 2D arrays
double **cross_norm=(double**)malloc(150 * sizeof(double *));
for(i=0; i<150;i++)
    {
        cross_norm[i]=(double*)malloc(num_items*sizeof(double));
    }
    
    //code
Window(N, window_buffer);
STFTforBMP(buffer,N,f, window_buffer);
getMagnitude(buffer,f, N, magnitude);
calculateEnergy(flux,magnitude, f);
calculateExpectedEnergy(expected_flux, candidate_beat_period, downbeat_location, f);
calculateCrossCorrelation(cross, flux, expected_values, f);
findLargestCrossCorrelation(&cross_max, cross, f);
normalizeCrossCorrelation(cross_norm, &cross_max, cross, f);
    ...............

我应该如何使用free函数?

您必须以与使用malloc()分配内存完全相反的顺序free()分配的内存。

请注意,只有在使用完分配的指针后,才应该释放内存。

1D阵列的内存分配:

    buffer = malloc(num_items*sizeof(double));

1D阵列的内存释放:

    free(buffer);

2D阵列的内存分配:

    double **cross_norm=(double**)malloc(150 * sizeof(double *));
    for(i=0; i<150;i++)
    {
        cross_norm[i]=(double*)malloc(num_items*sizeof(double));
    }

2D阵列的内存释放:

    for(i=0; i<150;i++)
    {
        free(cross_norm[i]);
    }
    free(cross_norm);

实际上,您不能在C中手动"释放"内存,因为内存是从进程释放回操作系统的。。。当您调用malloc()时,底层libc运行时将从操作系统请求一个内存区域。在Linux上,这可以通过像mmap()这样相对"繁重"的调用来完成。一旦这个内存区域映射到您的程序,就会有一个名为"空闲存储"的链表设置来管理这个分配的内存区域。当您调用malloc()时,它会快速查找空闲存储区中请求大小的空闲内存块。然后,它调整链表,以反映从最初分配的内存池中取出了一块内存。当您调用free()时,内存块将作为链表节点放回空闲存储中,指示其为可用内存块。

如果您请求的内存多于空闲存储中的内存,则libc运行时将再次向操作系统请求更多内存,直至操作系统为运行进程分配内存的能力极限。当你释放内存时,它不会返回到操作系统。。。它通常被回收到免费存储中,在那里它可以被另一个对malloc()的调用再次使用。因此,如果您使用不同的内存大小请求对malloc()free()进行了大量调用,理论上,这可能会导致一种称为"内存碎片"的情况,即空闲存储中有足够的空间来分配您请求的内存块,但没有足够的连续空间来满足您请求的块的大小。因此,对malloc()的调用失败,您实际上"内存不足",即使空闲存储中可能有大量可用内存(总字节数)。

相关内容

  • 没有找到相关文章