我应该在退出前释放内存吗?
Should I free memory before exit?
当我因错误退出程序时是否应该释放所有分配的内存?
something = (char**) malloc (x * sizeof(char*));
for (i = 0; i < x; i++)
something[i] = (char*) malloc (y + 1);
...
if (anything == NULL) {
printf("Your input is wrong!");
// should I free memory of every mallocated entity now?
exit(1);
}
else {
// work with mallocated entities
...
free(something); // it must be here
system("pause);
}
您不需要在程序终止前释放内存。以任何方式终止程序都会导致所有内存自动释放。
这取决于OS。最佳实践我会说你应该明确地释放它。如果你的内存没有在整个地方释放,我也不知道什么是好是坏等等,它也使得使用像 valgrind 这样的工具成为一个 PITA
如果在显式释放内存的 OS 上,您仍然会遇到其他资源的问题。随着您的应用程序开始增长并引入第三方库,您可能会出现资源泄漏。想象一下,我编写了一个库,要求您在处理程序上调用 close。此处理程序恰好由临时文件支持,除非您调用关闭,否则这些临时文件不会被删除。或者,我已经分离了 运行 在我正在使用信号或您不知道的其他资源进行管理的后台进程。
这实际上是一个非常难、难以估量的问题。
专业版(支持在退出前释放所有内容):
- 如果重新排列代码,以后不会出现错误或内存泄漏
- 没有来自 valgrind 或内存泄漏检查器的误报
- 如果您 运行 在越野车 OS 下,则没有内存泄漏,或者根本没有 OS
Con(直接退出,不用担心释放所有东西):
- 释放一切可能需要大量工作
- 释放所有内容会引入错误和崩溃
- 你的 OS 真的,真的应该在你退出时为你回收所有资源
还有一点(不确定是赞成还是反对):在大多数系统上,调用 free
不是 return 内存到操作系统(只有退出才会这样做)。
最后,您必须决定这些利弊中的哪一个对您最重要。不同的程序员在不同的情况下对不同的项目会得出不同的结论;这里没有放之四海而皆准的答案。
另见 this previous Stack Overflow question。
另见 question 7.24 in the C FAQ list。
您应该始终在退出前释放分配的内存。正如其他答案中已经提到的,这将最大限度地减少来自静态或动态分析工具等的警告。
但您应该始终这样做的真正原因是,释放通常会暴露应用程序中休眠的 运行-time 错误。
如果您在某处有导致内存损坏或更改指针地址的错误,该错误可能会保持沉默和休眠。直到你改变了一些与错误完全无关的东西,从而改变了内存布局。然后你突然崩溃了,你不知道为什么,因为这个错误甚至不在你刚刚添加的代码中。
通过释放内存,您会引发此类错误。因为如果堆或指向堆的指针有任何问题,那么你经常会在调用 free()
的地方崩溃。这意味着您在某个地方有一个严重的错误,您需要在发布程序之前找到它。
我有完全相反的情况:来自第三方库的静态对象的段错误析构函数。只是因为在退出前显式释放内存池。
我相信,还是合理一点,专注于程序结构更好。
当我因错误退出程序时是否应该释放所有分配的内存?
something = (char**) malloc (x * sizeof(char*));
for (i = 0; i < x; i++)
something[i] = (char*) malloc (y + 1);
...
if (anything == NULL) {
printf("Your input is wrong!");
// should I free memory of every mallocated entity now?
exit(1);
}
else {
// work with mallocated entities
...
free(something); // it must be here
system("pause);
}
您不需要在程序终止前释放内存。以任何方式终止程序都会导致所有内存自动释放。
这取决于OS。最佳实践我会说你应该明确地释放它。如果你的内存没有在整个地方释放,我也不知道什么是好是坏等等,它也使得使用像 valgrind 这样的工具成为一个 PITA
如果在显式释放内存的 OS 上,您仍然会遇到其他资源的问题。随着您的应用程序开始增长并引入第三方库,您可能会出现资源泄漏。想象一下,我编写了一个库,要求您在处理程序上调用 close。此处理程序恰好由临时文件支持,除非您调用关闭,否则这些临时文件不会被删除。或者,我已经分离了 运行 在我正在使用信号或您不知道的其他资源进行管理的后台进程。
这实际上是一个非常难、难以估量的问题。
专业版(支持在退出前释放所有内容):
- 如果重新排列代码,以后不会出现错误或内存泄漏
- 没有来自 valgrind 或内存泄漏检查器的误报
- 如果您 运行 在越野车 OS 下,则没有内存泄漏,或者根本没有 OS
Con(直接退出,不用担心释放所有东西):
- 释放一切可能需要大量工作
- 释放所有内容会引入错误和崩溃
- 你的 OS 真的,真的应该在你退出时为你回收所有资源
还有一点(不确定是赞成还是反对):在大多数系统上,调用 free
不是 return 内存到操作系统(只有退出才会这样做)。
最后,您必须决定这些利弊中的哪一个对您最重要。不同的程序员在不同的情况下对不同的项目会得出不同的结论;这里没有放之四海而皆准的答案。
另见 this previous Stack Overflow question。 另见 question 7.24 in the C FAQ list。
您应该始终在退出前释放分配的内存。正如其他答案中已经提到的,这将最大限度地减少来自静态或动态分析工具等的警告。
但您应该始终这样做的真正原因是,释放通常会暴露应用程序中休眠的 运行-time 错误。
如果您在某处有导致内存损坏或更改指针地址的错误,该错误可能会保持沉默和休眠。直到你改变了一些与错误完全无关的东西,从而改变了内存布局。然后你突然崩溃了,你不知道为什么,因为这个错误甚至不在你刚刚添加的代码中。
通过释放内存,您会引发此类错误。因为如果堆或指向堆的指针有任何问题,那么你经常会在调用 free()
的地方崩溃。这意味着您在某个地方有一个严重的错误,您需要在发布程序之前找到它。
我有完全相反的情况:来自第三方库的静态对象的段错误析构函数。只是因为在退出前显式释放内存池。 我相信,还是合理一点,专注于程序结构更好。