我分配了一个很大的内存,char* test= malloc(10000000);
,然后我把值放在这 block 内存上,并对每个值做一些工作。
我要的是,每1000个索引,我要释放所有内存直到它。
例如
for(long i=0; i<10000000;i++)
DoSomeWork(test[i]);
if(i%1000==0)
releaseMemory(i-1000,i);
我怎样才能在 C 中做到这一点?
我知道 free
只能释放我所有的分配,但我不想等到工作结束才释放所有内存。
我要每1000件作品免费全部返还1000件
我必须在程序开始时分配所有内存。
最佳答案
您可以通过将程序分配为更小的 block 来实现您想要的。
你必须调整你的算法来处理一堆小的子数组,然后你可以在使用后释放它们。
在这种情况下,以相反的方向分配 block 可能很有用,让 libc 有机会将释放的内存释放给底层操作系统。
让我在这里加强一点:
假设您想要一个包含 10000000(一千万)个条目的数组。与其像问题中描述的那样将其分配为一个 block ,不如将其分配给
#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;
}
程序如何增强堆以分配内存(大致)有两种可能性:
- 它可以从操作系统获得一个全新的内存块,独立于“主地址空间”。然后它可以使用它进行分配,并在
free()
d 时立即将其返回给操作系统。如果分配大小超过某个阈值,某些分配器就会发生这种情况。 - 它可以增强程序地址空间。然后,在最后添加新的内存。
free()
最后一个内存块后,程序地址空间可以再次减少。如果分配大小低于某个阈值,某些分配器就会发生这种情况。
这样,您的程序的内存占用会随着时间的推移而减少。
关于C如何释放子内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53287741/