C 在一次 free() 调用中释放所有选定的内存

问题描述 投票:0回答:1

我正在使用一个 C 函数

freeMemory()
,它获取一系列指针作为输入,并释放这些指针占用的内存,如下所示:

void freeMemory(char **parallel_commands, struct command *comands[], size_t num_parallel_commands) {
  free(parallel_commands);
  for (size_t i = 0; i < num_parallel_commands; i++) {
    for (struct command *cmd = comands[i]; cmd->num_argumentos != 0; cmd++)
      cleanCommand(cmd);
    free(comands[i]);
  }
}

您可以假设

cleanCommand()
函数内部有一个 free (相当于
free()
调用)。由于函数中存在嵌套循环,并且每次迭代 free 都必须调用操作系统来释放所需的内存,因此这个过程变得低效。

有什么方法可以并行释放

freeMemory()
函数内的内存吗?或者有什么方法可以在一次调用中释放所有选定的内存(知道所有指向相应内存部分的指针)?

c linux memory
1个回答
0
投票

有什么方法可以并行释放 freeMemory() 函数中的内存吗?

您可以启动多个线程来进行释放,但您可能会发现这会适得其反,使整个过程的成本更高。

或者有什么方法可以在一次调用中释放所有选定的内存(知道指向相应内存部分的所有指针)?

不。每个要进行

malloc()
处理的
free()
区域都需要自己调用
free()

除非您计算

exit()
——在托管实现上,您可以合理地期望操作系统在进程终止时回收该进程的所有资源。一些权威人士特别建议“不要”在程序退出时尽力释放剩余的分配内存。 示例

但是,如果您发现释放许多独立分配给您带来了问题,那么您可以考虑将它们聚合为更少的分配(即,首先分配更少、更大的区域)。即使这意味着您总体上会消耗更多内存,但这也可能是值得的。

© www.soinside.com 2019 - 2024. All rights reserved.