我正在使用一个 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()
函数内的内存吗?或者有什么方法可以在一次调用中释放所有选定的内存(知道所有指向相应内存部分的指针)?
有什么方法可以并行释放 freeMemory() 函数中的内存吗?
您可以启动多个线程来进行释放,但您可能会发现这会适得其反,使整个过程的成本更高。
或者有什么方法可以在一次调用中释放所有选定的内存(知道指向相应内存部分的所有指针)?
不。每个要进行
malloc()
处理的free()
区域都需要自己调用 free()
。
除非您计算
exit()
——在托管实现上,您可以合理地期望操作系统在进程终止时回收该进程的所有资源。一些权威人士特别建议“不要”在程序退出时尽力释放剩余的分配内存。 示例。
但是,如果您发现释放许多独立分配给您带来了问题,那么您可以考虑将它们聚合为更少的分配(即,首先分配更少、更大的区域)。即使这意味着您总体上会消耗更多内存,但这也可能是值得的。