堆、栈、free
2014-12-02 16:33
127 查看
堆和栈的对比:
栈(操作系统):由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。栈使用的是一级缓存, 他们通常都是被调用时处于存储空间中,调用完毕立即释放。结构特点,先进先出。
堆(操作系统): 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收,分配方式倒是类似于链表。堆则是存放在二级缓存中,生命周期由虚拟机的垃圾回收算法来决定(并不是一旦成为孤儿对象就能被回收)。所以调用这些对象的速度要相对来得低一些。
申请限制:
栈:在Windows下,栈是向低地址扩展的数据结构,是一块连续的内存的区域。这句话的意思是栈顶的地址和栈的最大容量是系统预先规定好的,在 WINDOWS下,栈的大小是2M(也有的说是1M,总之是一个编译时就确定的常数),如果申请的空间超过栈的剩余空间时,将提示overflow。因此,能从栈获得的空间较小。
堆:堆是向高地址扩展的数据结构,是不连续的内存区域。这是由于系统是用链表来存储的空闲内存地址的,自然是不连续的,而链表的遍历方向是由低地址向高地址。堆的大小受限于计算机系统中有效的虚拟内存。由此可见,堆获得的空间比较灵活,也比较大。
存储内容:
栈: 在函数调用时,在大多数的C编译器中,参数是由右往左入栈的,然后是函数中的局部变量。注意静态变量是不入栈的。当本次函数调用结束后,局部变量先出栈,然后是参数,最后栈顶指针指向最开始存的地址,也就是主函数中的下一条指令,程序由该点继续运行。
堆:一般是在堆的头部用一个字节存放堆的大小。堆中的具体内容由程序员安排。malloc()到的内存就属于堆中的。
free()函数:
功 能: 与malloc()函数配对使用,释放malloc函数申请的动态内存。
用 法: void free(void *ptr);
malloc()函数:
原型:extern void *malloc(unsigned int num_bytes);
功能:分配长度为num_bytes字节的内存块
返回值:如果分配成功则返回指向被分配内存的指针(此存储区中的初始值不确定),否则返回空指针NULL。当内存不再使用时,应使用free()函数将内存块释放。
malloc()与free()工作机制:
malloc函数的实质体现在,它有一个将可用的内存块连接为一个长长的列表的所谓空闲链表。调用malloc函数时,它沿连接表寻找一个大到足以满足用户请求所需要的内存块。然后,将该内存块一分为二(一块的大小与用户请求的大小相等,另一块的大小就是剩下的字节)。接下来,将分配给用户的那块内存传给用户,并将剩下的那块(如果有的话)返回到连接表上。调用free函数时,它将用户释放的内存块连接到空闲链上。
到最后,空闲链会被切成很多的小内存片段,如果这时用户申请一个大的内存片段,那么空闲链上可能没有可以满足用户要求的片段了。于是,malloc函数请求延时,并开始在空闲链上翻箱倒柜地检查各内存片段,对它们进行整理,将相邻的小空闲块合并成较大的内存块。如果无法获得符合要求的内存块,malloc函数会返回NULL指针,因此在调用malloc动态申请内存块时,一定要进行返回值的判断。
现在有一个问题:如果一个程序malloc了一块儿内存之后,不使用free()释放,当程序退出后,系统是否会自动回收那一部分内存?
本想实验一下,正在想办法。
<script>window._bd_share_config={"common":{"bdSnsKey":{},"bdText":"","bdMini":"2","bdMiniList":false,"bdPic":"","bdStyle":"0","bdSize":"16"},"share":{}};with(document)0[(getElementsByTagName('head')[0]||body).appendChild(createElement('script')).src='http://bdimg.share.baidu.com/static/api/js/share.js?v=89860593.js?cdnversion='+~(-new Date()/36e5)];</script>
阅读(61) | 评论(0) | 转发(0) |
0
上一篇: linux下 C语言perror函数的作用
下一篇:\r\n 与 \n 的前世今生
相关热门文章
记张家界自由行归来,2014...
当我们老了
BUG解析:InnoDB两次写与多实例...
健身器材管理制度
亚发消毒毛巾厂房实习见闻:精...
test123
编写安全代码——小心有符号数...
使用openssl api进行加密解密...
一段自己打印自己的c程序...
sql relay的c++接口
如何提高中文域名网站权重呢?...
windows有发展前景吗
谁能够帮我解决LINUX 2.6 10...
现在的博客积分不会更新了吗?...
shell怎么读取网页内容...
给主人留下些什么吧!~~
评论热议
栈(操作系统):由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。栈使用的是一级缓存, 他们通常都是被调用时处于存储空间中,调用完毕立即释放。结构特点,先进先出。
堆(操作系统): 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收,分配方式倒是类似于链表。堆则是存放在二级缓存中,生命周期由虚拟机的垃圾回收算法来决定(并不是一旦成为孤儿对象就能被回收)。所以调用这些对象的速度要相对来得低一些。
申请限制:
栈:在Windows下,栈是向低地址扩展的数据结构,是一块连续的内存的区域。这句话的意思是栈顶的地址和栈的最大容量是系统预先规定好的,在 WINDOWS下,栈的大小是2M(也有的说是1M,总之是一个编译时就确定的常数),如果申请的空间超过栈的剩余空间时,将提示overflow。因此,能从栈获得的空间较小。
堆:堆是向高地址扩展的数据结构,是不连续的内存区域。这是由于系统是用链表来存储的空闲内存地址的,自然是不连续的,而链表的遍历方向是由低地址向高地址。堆的大小受限于计算机系统中有效的虚拟内存。由此可见,堆获得的空间比较灵活,也比较大。
存储内容:
栈: 在函数调用时,在大多数的C编译器中,参数是由右往左入栈的,然后是函数中的局部变量。注意静态变量是不入栈的。当本次函数调用结束后,局部变量先出栈,然后是参数,最后栈顶指针指向最开始存的地址,也就是主函数中的下一条指令,程序由该点继续运行。
堆:一般是在堆的头部用一个字节存放堆的大小。堆中的具体内容由程序员安排。malloc()到的内存就属于堆中的。
free()函数:
功 能: 与malloc()函数配对使用,释放malloc函数申请的动态内存。
用 法: void free(void *ptr);
malloc()函数:
原型:extern void *malloc(unsigned int num_bytes);
功能:分配长度为num_bytes字节的内存块
返回值:如果分配成功则返回指向被分配内存的指针(此存储区中的初始值不确定),否则返回空指针NULL。当内存不再使用时,应使用free()函数将内存块释放。
malloc()与free()工作机制:
malloc函数的实质体现在,它有一个将可用的内存块连接为一个长长的列表的所谓空闲链表。调用malloc函数时,它沿连接表寻找一个大到足以满足用户请求所需要的内存块。然后,将该内存块一分为二(一块的大小与用户请求的大小相等,另一块的大小就是剩下的字节)。接下来,将分配给用户的那块内存传给用户,并将剩下的那块(如果有的话)返回到连接表上。调用free函数时,它将用户释放的内存块连接到空闲链上。
到最后,空闲链会被切成很多的小内存片段,如果这时用户申请一个大的内存片段,那么空闲链上可能没有可以满足用户要求的片段了。于是,malloc函数请求延时,并开始在空闲链上翻箱倒柜地检查各内存片段,对它们进行整理,将相邻的小空闲块合并成较大的内存块。如果无法获得符合要求的内存块,malloc函数会返回NULL指针,因此在调用malloc动态申请内存块时,一定要进行返回值的判断。
现在有一个问题:如果一个程序malloc了一块儿内存之后,不使用free()释放,当程序退出后,系统是否会自动回收那一部分内存?
本想实验一下,正在想办法。
<script>window._bd_share_config={"common":{"bdSnsKey":{},"bdText":"","bdMini":"2","bdMiniList":false,"bdPic":"","bdStyle":"0","bdSize":"16"},"share":{}};with(document)0[(getElementsByTagName('head')[0]||body).appendChild(createElement('script')).src='http://bdimg.share.baidu.com/static/api/js/share.js?v=89860593.js?cdnversion='+~(-new Date()/36e5)];</script>
阅读(61) | 评论(0) | 转发(0) |
0
上一篇: linux下 C语言perror函数的作用
下一篇:\r\n 与 \n 的前世今生
相关热门文章
记张家界自由行归来,2014...
当我们老了
BUG解析:InnoDB两次写与多实例...
健身器材管理制度
亚发消毒毛巾厂房实习见闻:精...
test123
编写安全代码——小心有符号数...
使用openssl api进行加密解密...
一段自己打印自己的c程序...
sql relay的c++接口
如何提高中文域名网站权重呢?...
windows有发展前景吗
谁能够帮我解决LINUX 2.6 10...
现在的博客积分不会更新了吗?...
shell怎么读取网页内容...
给主人留下些什么吧!~~
评论热议
相关文章推荐
- FreeBSD6.2 安装apache22+PHP5.2.X+MySQL5.X
- 树分治点分治(spoj1825 Free tour II)
- 在Windows下进行Linux/FreeBSD/Unix的GCC远程开发和调试
- linux源代码阅读笔记 get_free_page()代码分析
- DotNetTextBox V3.0 所见即所得编辑器控件Ver3.3.4 Free(免费版)
- Delphi TcsCDP 2014.02 free keygen, activation manual on Win7
- Freewins++:自由窗口更上一层楼!
- free命令详解
- FreeBSD之WEB服务器配置
- To free pagecache
- Freefluo--流程编制引擎
- 【dfs or 最短路】【HDU1224】【Free DIY Tour】
- 分析以及测试PCTFREE和PCTUSED参数是如何协调工作的(下)
- BTSync FREE vs BTSync PRO
- 安装远程桌面,VNC Server on FreeBSD + VNC Viewer on Windows !
- malloc/free与new/delete的区别
- AutoFreeAlloc细节
- 关于mysql_free_result和mysql_close的解惑
- dbms_space.free_space
- linux内存之free used buffer cach