malloc 申请得到的内存后,再 free 释放它的时候,操作系统会立即收回那块内存吗?

stackoverflow上的回答: 

In many malloc/free implementations, free does normally not return the memory to the operating system (or at least only in rare cases). The reason is, that you will get gaps in your heap and thus it can happen, that you just finish off your 2 or 4 GB of virtual memory with gaps. This should be avoided of course, since as soon as the virtual memory is finished, you will be in really big trouble. The other reason of course is, that the OS can only handle memory chunks that are of a specific size and alignment. To be specific: Normally the OS can only handle blocks that the virtual memory manager can handle (most often multiples of 512 Bytes eg. 4KB).

So returning 40 Bytes to the OS will just not work. So what does free do?

Free will put the memory block in its own free block list. Normally it also tries to meld together adjacent blocks in the address space. The free block list is just a circular list of memory chunks which have of course some administrative data in the beginning. This is also the reason, why managing very small memory elements with the standard malloc/free is not efficient. Every memory chunk needs additional data and with smaller sizes more fragmentation happens.

The free-list is also the first place that malloc looks at when a new chunk of memory is needed. It is scanned before it calls for new memory from the OS. When a chunk is found that is bigger then the needed memory, it is just divided into two parts. One is returned to caller, the other is put back into the free list.

There are many different optimizations to this standard behaviour (for example for small chunks of memory). But since malloc and free must be so universal, the standard behaviour is always the fallback when alternatives are not usable. There are also optimizations in handling the free-list -- for example storing the chunks in lists sorted by sizes. But all optimizations also have their own limitations.

首先malloc()/free()的操作取决于操作系统和编译器的实现。一般来说当你调用malloc(),系统会从堆中给你分配一块足够大的空闲内存,并返回指向它的指针,并且标记它不再空闲。当调用free(),系统检查这块内存的大小,并把它加入到free列表中,而不是立即回收它的内存,因为操作系统只能处理特定大小且连续的内存块:一般来说是512Bytes的倍数。Free内存块链表的另一个作用是,当调用malloc()时,系统会首先从这个表中查找符合要求的内存块,如果找不到适合大小的内存块再向操作系统申请新的内存空间。

时间: 2024-10-27 00:06:03

malloc 申请得到的内存后,再 free 释放它的时候,操作系统会立即收回那块内存吗?的相关文章

《C语言中分配了动态内存后一定要释放吗?》

问:比如main函数里有一句 malloc(),后面没有free()1.那么当main结束后,动态分配的内存不会随之释放吗?2.如果程序结束能自动释放,那么还加上free(),是出于什么考虑? 答: 1. 就算没有free(),main()结束后也是会自动释放malloc()的内存的,这里监控者是操作系统,设计严谨的操作系统会登记每一块给每一个应用程序分配的内存,这使得它能够在应用程序本身失控的情况下仍然做到有效地回收内存.你可以试一下在TaskManager里强行结束你的程序,这样显然是没有执

有关于malloc申请内存和free内存释放

p { margin-bottom: 0.25cm; line-height: 120% } a:link { } malloc工作机制: malloc函数的实质体现在,它有一个将可用的内存块连接为一个长长的列表的所谓空闲链表(堆内存).调用malloc函数时,它沿连接表寻找一个大到足以满足用户请求所需要的内存块.然后,将该内存块一分为二(一块的大小与用户请求的大小相等,另一块的大小就是剩下的字节).接下来,将分配给用户的那块内存传给用户,并将剩下的那块(如果有的话)返回到连接表上.调用free

Linux系统下深究一个malloc/brk/sbrk新内存后的page fault问题

有耳可听的,就应当听 -<马可福音> 周四的休假团建又没有去,不因别的,只因年前东北行休假太多了,想缓缓-不过真实原因也确实因为假期剩余无几了-思考了一些问题,写下本文. ??本文的缘起来自于和同事讨论一个关于缺页中断按需调页的讨论.真可谓是三人行必有我师,最近经常能从一些随意的比划或招架中悟出一丝意义,所以非常感谢周围的信息输出者!甚至从小小学校全员禁言的作业群里,我都能每天重温一首古诗词,然后循此生意,去故意制造另一种真实的意境,然后发个朋友圈?~ ??感谢大家的信息输入,每次收到的好玩的

结构体数组与用malloc申请结构体空间的对比

结构体数组与用malloc申请结构体空间的对比 文章标题听起来很拗口,可能我描述的不太清楚,还是看例程吧: 我先写以前最早会用的malloc: 1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <string.h> 4 5 struct student 6 { 7 char *name; 8 int age; 9 }; 10 11 int main() 12 { 13 struct student *p_stud

JAVA内存管理再解

首先我们要明白一点,我们所使用的变量就是一块一块的内存空间!! 一.内存管理原理:   在java中,有java程序.虚拟机.操作系统三个层次,其中java程序与虚拟机交互,而虚拟机与操作系统间交互!这就保证了java程序的平台无关性!下面我们从程序运行前,程序运行中.程序运行内存溢出三个阶段来说一下内存管理原理! 1.程序运行前:JVM向操作系统请求一定的内存空间,称为初始内存空间!程序执行过程中所需的内存都是由java虚拟机从这片内存空间中划分的. 2.程序运行中:java程序一直向java

CentOS 6.2最小化安装后再安装图形界面

在安装CentOS 6.2时发现它没有提示我要怎么安装,而是"自作主张"地给我选择了最小化安装,结果装完之后只有终端界面,因为有时候不得不用图形界面,所以如果没有图形界面也是很麻烦的. 后来通过百度才知道为什么它不让我选了,因为我用的是虚拟机,由于物理机本身配置就不高,所以我就没给虚拟机分配太多内存,而CentOS 6.2会根据你分配的内存大小决定安装方式,具体的界定我也忘记了,好像是512M还是1G,不过没关系,我们可以自己来安装图形界面,下面来说一下怎么安装. 1.yum -y g

CentOS 6,7最小化安装后再安装图形界面

CentOS 6.2最小化安装后再安装图形界面 在安装CentOS 6.2时发现它没有提示我要怎么安装,而是“自作主张”地给我选择了最小化安装,结果装完之后只有终端界面,因为有时候不得不用图形界面,所以如果没有图形界面也是很麻烦的. 后来通过百度才知道为什么它不让我选了,因为我用的是虚拟机,由于物理机本身配置就不高,所以我就没给虚拟机分配太多内存,而CentOS 6.2会根据你分配的内存大小决定安装方式,具体的界定我也忘记了,好像是512M还是1G,不过没关系,我们可以自己来安装图形界面,下面来

使用LibUsbDotNet时,当关闭后再打开USB设备就会报“已关闭safe handle”

由于项目中需要和USB设备通讯,于是用到LibUsbDotNet.dll这个开源的项目.但是在使用的时候发现关闭USB设备后再打开,过2秒就会出现异常“已关闭safe handle”,由于网上关于LibUsbDotNet的资料比较少,查了好久都查不出原因.不过用关键字“已关闭safe handle”的时候,发现很多人使用SerialPort时也遇到这个问题. 由于对底层实现不懂,所以只能猜测原因.在使用Usb.read()或者SerialPort.read()方法的时候,都会开辟一个局部变量数组

添加内存后,电脑注册表还需要做什么修改?

电脑执行多任务或者大型3D场景出现卡顿的情况,我们都会选择增加电脑内存来解决,但很多用户却反映增加内存后电脑并没有什么明显改善,只有在视频处理或者PS时才会显现出效果.其实这是Windows系统要照顾没有配备大容量内存的电脑而进行的设置,为的是让系统能更好更稳定的运行.而我们的电脑增加过内存后,就可以通过修改注册表的方式来打破这些限制,感受大内存带来的完美体验.电脑增加内存后注册表的相关设置方法1.使用"WIN+R"打开运行对话框,输入"regedit"打开注册表编