动态分配内存的所有权是什么?
例如,在一个程序中动态分配内存,如下所示:
int main()
{
int * p = malloc(10 * sizeof(int));
return 0;
}
1)如果该程序退出,那么p
指向的内存是freed()
吗?
我认为答案是,它不会自动释放。
2)如果此程序崩溃,那么p
指向的内存是freed()
吗?
答案 0 :(得分:1)
Memory Deallocation And Allocation
此链接将在很大程度上帮助您解决问题
以下文字来自上述链接: -
几乎每个现代操作系统都会在程序退出后恢复所有已分配的内存空间。我能想到的唯一例外可能是Palm OS,程序的静态存储和运行时内存几乎是一样的,所以不释放可能会导致程序占用更多存储空间。 (我只是在这里推测。)
所以一般情况下,除了拥有超出您需要的存储空间的运行时成本之外,它没有任何损害。当然,在你给出的例子中,你想保留一个可能被使用的变量的内存,直到它被清除。
然而,只要你不再需要它就可以释放内存,并且在程序退出时释放你仍然拥有的任何东西。这更像是一种了解你正在使用的记忆,并思考你是否仍然需要它的练习。如果不跟踪,可能会发生内存泄漏。
另一方面,在退出时关闭文件的类似告诫具有更具体的结果 - 如果不这样做,您写入的数据可能无法刷新,或者如果它们是临时文件,完成后,它们可能不会被删除。此外,数据库句柄应提交其事务,然后在完成它们时关闭。类似地,如果您使用的是面向对象的语言(如C ++或Objective C),那么在完成对象时不释放对象将意味着析构函数永远不会被调用,并且类负责的任何资源都可能无法清除。
答案 1 :(得分:0)
在linux上,只要进程终止,它的所有内存都将被释放,以便重用。
如果您的程序长期运行(例如shell或Web服务器守护程序),您应该手动释放每一块内存,否则,随着时间的推移,可能会达到内存限制,并且您无法长时间分配内存。 / p>
如果您的程序运行时间很短,您可以在进程终止时自动完成空闲作业。实际上,free()本身也需要时间,所以这会节省一些机器资源,即使它没有被强烈建议。
手动释放()每一块记忆,也可以提高你的维护能力。您的项目长期可读性。答案 2 :(得分:0)
提到:GNU libc manual page for free()
所以,根据libc手册
在程序结束时释放块是没有意义的,因为当进程终止时,所有程序的空间都会返回给系统。
因此即使程序崩溃,内存也会被释放并返回给系统