当程序退出后,动态申请的内存会自动释放吗
Posted 哦摩西罗伊
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了当程序退出后,动态申请的内存会自动释放吗相关的知识,希望对你有一定的参考价值。
stackoverflow有人问了这么一个问题,下面这段程序执行完毕后,malloc的内存会释放吗
- <span style="font-size:18px;">int main () {
- int *p = malloc(10 * sizeof *p);
- *p = 42;
- return 0; //Exiting without freeing the allocated memory
- }</span>
赞数最多的这么回答:
It depends on the operating system. The majority of modern (and all major) operating systems will free memory not freed by the program when it ends.
Relying on this is bad practice and it is better to free it explicitly. The issue isn‘t just that your code looks bad. You may decide you want to integrate your small program into a larger, long running one. Then a while later you have to spend hours tracking down memory leaks.
Relying on a feature of an operating system also makes the code less portable.
因此这些内存是会被大部分现代操作系统释放掉的,这些系统包括
MacOS X, Linux, all recent version of Windows, and all currently manufactured phone handsets
一些老的系统不会释放:
If
you‘re programming on microcontrollers,
on MacOS 9 or earler, DOS, or Windows 3.x, then you might need to be
concerned about memory leaks making memory permenantly unavailable to
the whole operating system.
解释如下:
Most modern operating systems employ a memory manager, and all userland processes only see so-called virtual memory, which is not related to actual system memory in a way that the program could inspect. This means that programs cannot simply read another process‘s memory or kernel memory. It also means that the memory manager will completely "free" all memory that has been assigned to a process when that process terminates, so that memory leaks within the program do not usually "affect" the rest of the system (other than perhaps forcing a huge amount of disk swapping and perhaps some "out of memory" behaviour).
This doesn‘t mean that it‘s in any way OK to treat memory leaks light-heartedly, it only means that no single program can casually corrupt other processes on modern multi-tasking operating systems (deliberate abuse of administrative privileges notwithstanding, of course).
此外The Linux Programming Interface书中有这么一段:
When a process terminates, all of its memory is returned to the system, including heap memory allocated by functions in the
malloc package. In programs that allocate memory and continue using it until program termination, it is common to omit calls to
free(), relying on this behavior to automatically free the memory.
This can be especially useful in programs that allocate many blocks of memory, since adding multiple calls to
free() could be expensive in terms of CPU time, as well as perhaps being complicated to code.
我们在学习C语言时,老师就告诉我们,动态开辟内存之后,要及时回收,不然就会造成内存泄漏。
现在想想内存泄漏是指在当前进程在堆中分配了空间后,完成了相关的操作,没有及时释放掉(不再需要此空间),并且进程没有结束!
以上是关于当程序退出后,动态申请的内存会自动释放吗的主要内容,如果未能解决你的问题,请参考以下文章