我分配了一个大内存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个背面
我必须在程序开始时分配所有内存。
您想要的东西可以通过将程序分配到更小的块中来实现。
你必须调整你的算法来处理一堆小的子数组,然后你可以在使用后释放它们。
在这种情况下,以相反的方向分配块可能会很有用,这样libc就有机会将释放的内存释放给底层操作系统。
让我在这里增强一点:
假设您想要一个包含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后立即将其返回给操作系统。如果分配大小高于某个阈值,则在某些分配器中会发生这种情况 - 它可以增强程序地址空间。然后,在末尾添加新的内存。在对最后一个存储器块进行
free()
寻址之后,可以再次减小程序地址空间。如果分配大小低于某个阈值,则在某些分配器中会发生这种情况
这样,程序的内存占用就会随着时间的推移而减少。