Luc*_*fia 20 c malloc free dynamic-allocation
因错误而退出程序时,我应该释放所有的mallocated内存吗?
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);
}
Run Code Online (Sandbox Code Playgroud)
Ste*_*mit 18
这实际上是一个非常困难,无法估量的问题.
Pro(支持在退出前释放所有内容):
Con(只需退出,不要担心释放一切):
最后,您必须决定哪些优点和缺点对您最重要.不同情况下不同项目的不同程序员会得出不同的结论; 这里没有一个通用的答案.
fuz*_*fuz 10
在程序终止之前,您不需要释放内存.以任何方式终止程序会导致所有内存自动解除分配.
在退出之前,应始终释放已分配的内存.正如其他答案中已经提到的,这将最大限度地减少静态或动态分析工具等的警告.
但是你应该总是这样做的真正原因是因为释放经常暴露应用程序中的休眠运行时错误.
如果某个地方有一个导致内存损坏或更改指针地址的错误,那么该错误可能会保持沉默并处于休眠状态.直到你改变与bug完全无关的东西,从而改变内存布局.然后你突然崩溃了,你也不知道为什么,因为这个bug甚至没有出现在你刚添加的代码中.
通过释放内存,你会引发这样的错误.因为如果堆有任何问题或者指针指向堆,那么你经常会在你调用的地方崩溃free().这意味着您在运送程序之前需要找到一个严重的错误.
这取决于操作系统。最佳实践是,您应该明确释放它。如果您没有在整个地方释放内存,并且我无法分辨出什么是好的和坏的,它也使使用valgrind这样的工具成为PITA。
如果在明确释放内存的操作系统上,您仍然会遇到其他资源问题。随着您的应用程序开始增长并引入第三方库,您可能会遇到资源泄漏的情况。想象一下,我已经编写了一个库,要求您在处理程序上调用close。除非您调用close,否则该处理程序恰好由不会被删除的临时文件支持。或者,我已经使用信号或您不知道的其他资源分离了在后台运行的进程,这些进程正在管理中。
| 归档时间: |
|
| 查看次数: |
6239 次 |
| 最近记录: |