C如何释放子内存?

时间:2018-11-13 18:53:27

标签: c memory malloc free

我分配了一个大内存char* test= malloc(10000000);,然后将值放在此内存上,并对每个值做一些工作。

我想要的是每1000个索引,我要释放所有内存直到它。

例如。

for(long i=0; i<10000000;i++)
   DoSomeWork(test[i]);
   if(i%1000==0)
       releaseMemory(i-1000,i);

我如何在c语言中完成?

我知道free只能释放所有分配的内存,但是我不想等到工作结束时才释放所有的内存。

我希望每1000部作品免费释放全部1000部

我必须在程序开始时分配所有内存。

1 个答案:

答案 0 :(得分:2)

通过将程序分配到较小的块中,可以实现所需的内容。

您必须调整算法以处理一堆小的子数组,然后在使用后释放它们。

在这种情况下,以相反的方向分配块以使libc有机会将释放的内存释放到底层OS上可能是有用的。

让我在这里增强一点:

假设您想要一个具有10000000(1000万)个条目的数组。而不是像问题中描述的那样将其分配为一个大块,有可能

#define CHUNKSIZE 10000
#define ENTRYSIZE 8
#define NUM_CHUNKS 1000

void test(void)
{
    void** outer_array = malloc(NUM_CHUNKS * sizeof(void*))
    for (int i = 0; i < NUM_CHUNKS; i++) {
        void * chunk = malloc(CHUNKSIZE * ENTRYSIZE);
        outer_array[NUM_CHUNKS - 1 - i] = chunk;
        // allocate them in reverse order
    }

    // now, set item #123456
    size_t item_index = 123456;
    // TODO check if the index is below the maximum
    size_t chunk_index = item_index / CHUNKSIZE;
    size_t index_into_chunk = item_index % CHUNKSIZE;
    void * item_address = &outer_array[chunk_index][index_into_chunk * ENTRY_SIZE];

    // after having processed one chunk, you can free it:
    free(outer_array[0]);
    outer_array[0] = NULL;
}

(大致)有两种方法可以使程序增强堆以分配内存:

  1. 它可以从OS获取一个全新的存储块,而与“主地址空间”无关。然后,它可以使用它进行分配,并在free() d之后立即将其返回给OS。如果分配大小超过某个阈值,则会在某些分配器中发生这种情况。
  2. 它可以增强程序地址空间。然后,最后添加新的内存。在free()最后一个存储块之后,可以再次减少程序地址空间。如果分配大小低于某个阈值,则会在某些分配器中发生这种情况。

这样,您的程序的内存占用量会随着时间的推移而减少。