gpt4 book ai didi

c - 如果程序即将退出,释放分配的内存真的很重要吗?

转载 作者:行者123 更新时间:2023-12-04 00:47:00 25 4
gpt4 key购买 nike

这个问题在这里已经有了答案:





What REALLY happens when you don't free after malloc before program termination?

(19 个回答)


6年前关闭。




我了解,如果您要分配内存来临时存储某些内容,例如响应用户操作,并且当代码再次到达该点时,您不再需要内存,您应该释放内存,这样它就不会不会导致泄漏。如果不清楚,这里有一个我知道释放内存很重要的例子:

#include <stdio.h>
#include <stdlib.h>

void countToNumber(int n)
{
int *numbers = malloc(sizeof(int) * n);

int i;
for (i=0; i<n; i++) {
numbers[i] = i+1;
}
for (i=0; i<n; i++) {
// Yes, simply using "i+1" instead of "numbers[i]" in the printf would make the array unnecessary.
// But the point of the example is using malloc/free, so pretend it makes sense to use one here.
printf("%d ", numbers[i]);
}
putchar('\n');

free(numbers); // Freeing is absolutely necessary here; this function could be called any number of times.
}

int main(int argc, char *argv[])
{
puts("Enter a number to count to that number.");
puts("Entering zero or a negative number will quit the program.");

int n;
while (scanf("%d", &n), n > 0) {
countToNumber(n);
}

return 0;
}

然而,有时我会在程序运行的整个过程中都需要该内存,即使我最终为同一目的分配了更多内存,存储在先前分配的内存中的数据仍在使用中。所以我最终需要释放内存的唯一一次是在程序退出之前。

但是如果我最终不释放内​​存,那真的会导致内存泄漏吗?我认为操作系统会在进程退出后立即回收内存。即使它不会导致内存泄漏,是否还有另一个原因释放内存很重要,前提是这不是 C++ 并且不需要调用析构函数?

例如,是否需要 free在下面的例子中调用?
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
void *ptr = malloc(1024);
// do something with ptr
free(ptr);
return 0;
}

在这种情况下, free并不是真的不方便,但是在我为包含指向其他动态分配数据的指针的结构动态分配内存的情况下,很高兴知道我不需要设置循环来执行此操作。特别是如果结构中的指针指向具有相同结构的对象,我需要递归地删除它们。

最佳答案

通常,操作系统会回收内存,所以不,您不必 free()它。但这样做确实是一种很好的做法,在某些情况下,它实际上可能会有所作为。几个例子:

  • 您将程序作为另一个进程的子进程执行。根据完成的方式(参见下面的评论),在父级完成之前不会释放内存。如果 parent 永远不会完成,那就是永久泄漏。
  • 你改变你的程序去做别的事情。现在你需要寻找每条导出路径并释放所有东西,你可能会忘记一些。
  • 回收内存是操作系统的意志。所有主要的都这样做,但如果您将程序移植到另一个系统,它可能不会。
  • 静态分析和调试工具使用正确的代码可以更好地工作。
  • 如果内存是在进程之间共享的,它可能只有在所有进程终止后才会被释放,或者甚至可能不会被释放。


  • 顺便说一句,这只是关于内存。释放其他资源,例如关闭文件 ( fclose()) 更为重要,因为某些操作系统 (Windows) 无法正确刷新流。

    关于c - 如果程序即将退出,释放分配的内存真的很重要吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32966125/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com