C如何释放子内存?

标签 c memory malloc free

我分配了一个很大的内存,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;
}

程序如何增强堆以分配内存(大致)有两种可能性:

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

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

关于C如何释放子内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53287741/

相关文章:

c - 在这种情况下如何正确释放双指针的内存?

c - 读取二维数组中的txt文件解决方案

c++ - 为什么我们不能从 void* 隐式分配给 C++ 中的任何其他类型,但它在 C 中更受欢迎?

c - fatal error : libavcodec/avcodec. h 没有这样的文件或目录编译终止

c - 这段代码是否会导致内存泄漏

r - 如何避免R中的内存限制

C linux shmget 参数无效

C/Cython : Initial content of an malloc memory allocation

c - 递归 C 函数 - 打印升序

c - 如何在 Cmake 中链接 curses.h?