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