如果我通过传递返回0来结束执行会发生什么?使用malloc后没有释放分配的内存部分?
int * var;
var = (int *)malloc(sizeof(int)) ;
free(var) ;
return 0;
答案 0 :(得分:2)
程序包含内存泄漏,如here所述。要具体回答这个问题,内存泄漏的影响取决于环境;在最好的情况下,没有任何反应,在最坏的情况下,机器迟早会崩溃。在任何情况下,内存泄漏的存在都被视为一个错误。
答案 1 :(得分:1)
这是特定于实现的。
大多数operating systems(特别是桌面或服务器操作系统,例如Linux,MacOSX,Windows ......)一旦process终止,每个已用资源都会被释放,其中包括{{3} }}。因此,即使释放了非free
堆内存。
特别是,如果您编写一个快速运行的程序(例如,您知道总是将在不到几秒的时间内运行),则可能更容易接受一些virtual address space(但是如果您这样做,请在您的代码和/或文档中对此进行评论)。许多现实生活中的程序正在这样做(特别是memory leak编译器,可能还有几个GCC)。
相反,如果您正在编写服务器(例如数据库或计算服务器),则应避免任何内存泄漏,这会导致服务器进程Unix shells无限增长(直到某些崩溃)。在回复该请求之后,您通常应该非常小心处理一个请求的每个已分配的堆内存得到free
- d。
在某些嵌入式操作系统上,如果您没有显式释放所有资源(free
所有堆分配的内存,fclose
所有打开的流)并且正确地,您有RSS
另见resource leak相关问题。在许多操作系统(包括Linux)上,您可以使用this来捕获内存泄漏错误。使用最近的gcc
,您可以使用-g -fsanitize=address
之类的valgrind
还阅读(至少有关概念和术语)关于debugging options和garbage collection的内容。如果使用C编程,您可以考虑使用fragmentation。
然而,有一个非常好的实际理由系统地free
所有以前的malloc
- 内存:它是一个很好的编程规则,它使用像valgrind
这样的工具有很多帮助帮助调试真正的内存错误。它还使您的代码更加干净,并且您可以在某些不同的上下文中重用它(例如,作为某些库的一部分,可用于长时间运行的进程)。
答案 2 :(得分:0)
如果您没有释放内存,您的应用程序将会出现内存泄漏。因此,如果您没有释放内存并将应用程序保持开启状态几天,它将开始变慢,并最终崩溃。