2015-06-03 91 views
0

动态分配内存的所有权是什么?动态分配内存的所有权

例如,在一个程序动态分配存储器这样的:

int main() 
{ 
    int * p = malloc(10 * sizeof(int)); 

    return 0; 
} 

1)如果此程序退出,然后将所述存储器由p指出是freed()? 我认为答案是,它不会被自动释放。

2)如果这个程序崩溃,那么p指向的内存是freed()

+0

这是特定环境/操作系统。通常的桌面/服务器操作系统在处理终止后非常善于清理,无论原因如何。 –

+0

那么......哪个OS /环境? –

+0

可能还想阅读有关虚拟内存的内容。 –

回答

1

Memory Deallocation And Allocation

此链接将帮助您在很大程度上解决您的问题

下面的文字是从上面提到的链接: -

几乎每个现代操作系统都会在程序退出后恢复所有分配的内存空间。我能想到的唯一例外可能就像Palm OS,其中程序的静态存储和运行时内存几乎相同,所以不释放可能会导致程序占用更多的存储空间。 (我只是在这里推测)。

所以一般来说,除了运行时存储的存储空间超过你的需要的运行成本之外,没有什么坏处。当然,在你给出的例子中,你想保留一个可能被使用的变量的内存直到它被清除。

但是,一旦你不再需要它,释放内存就被认为是一种很好的方式,并释放你在程序退出时仍然存在的任何东西。这更多的是了解你正在使用的内存,并考虑你是否仍然需要它。如果你不跟踪,你可能会有内存泄漏。另一方面,在退出时关闭文件的类似警告有一个更具体的结果 - 如果您不这样做,那么您写入它们的数据可能不会被刷新,或者它们是临时文件,完成后它们可能不会被删除。此外,数据库句柄应该有他们的事务提交,然后关闭,当你完成他们。同样,如果您使用的是面向对象的语言,如C++或Objective C,则在完成对象时不释放对象意味着析构函数将永远不会被调用,并且该类负责的任何资源可能不会被清理。

0

在linux上,只要进程终止,它的所有内存都将被释放,以供重用。

如果您的程序长期运行(例如shell或web服务器守护进程),您应该手动释放每一块内存,否则随着时间的推移可能会达到内存的限制,并且您无法长期分配内存。

如果您的程序运行时间很短,您可以在进程终止时自动完成空闲作业。实际上,free()本身也需要时间,所以这可以节省一些机器资源,尽管强烈的不建议。

免费()手工每一块内存,也提高您的项目长期可读性维护。

0

简称:GNU libc manual page for free()

因此,根据libc的手册

,有在一个节目的最后释放块中没有点,因为所有的程序的空间的返还给系统的时候进程终止。

所以,即使你的程序崩溃,内存被释放,并归还给系统