我分配了一个大内存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部
我必须在程序开始时分配所有内存。
答案 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;
}
(大致)有两种方法可以使程序增强堆以分配内存:
free()
d之后立即将其返回给OS。如果分配大小超过某个阈值,则会在某些分配器中发生这种情况。free()
最后一个存储块之后,可以再次减少程序地址空间。如果分配大小低于某个阈值,则会在某些分配器中发生这种情况。这样,您的程序的内存占用量会随着时间的推移而减少。