免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: KBTiller
打印 上一主题 下一主题

特邀专家在线答疑——名不正则言不顺 一网打尽C语言基本概念 [复制链接]

论坛徽章:
0
111 [报告]
发表于 2011-04-26 13:39 |只看该作者
本帖最后由 contiguous 于 2011-04-26 13:47 编辑

回复 109# DNFCF


    如果按你说的,那个我的指针指的是5个struct的大小,而free从我的指针类型上应该只能通知是一个struct的大小,所以free只会释放一个struct的空间,而另外的4个就丢了。

论坛徽章:
0
112 [报告]
发表于 2011-04-26 13:43 |只看该作者
回复 104# txdgtwpv


    按理说操作系统应该知道。但malloc不是在c库中实现的吗?有很多的不解。

论坛徽章:
0
113 [报告]
发表于 2011-04-26 13:54 |只看该作者
回复 111# contiguous


   首先我承认 我错了!!!
看了一下free函数的原型:void free(void *)

论坛徽章:
0
114 [报告]
发表于 2011-04-26 14:29 |只看该作者
回复 97# KBTiller


    我在ubuntu下面用gcc。运行会出现段错误。

论坛徽章:
0
115 [报告]
发表于 2011-04-26 17:38 |只看该作者
回复 114# omycle


    所以,在个别编译器上编译通过且能执行的“未定义行为”是根本靠不住的

论坛徽章:
0
116 [报告]
发表于 2011-04-26 17:50 |只看该作者
回复  KBTiller


    那free到底做了什么呢???他所谓的释放内存到底做了什么呢???
DNFCF 发表于 2011-04-26 12:35



    这个问题有点难度
    首先,这个问题没有统一的标准答案,在各个OS下必然有差异。
    其次,这个问题其实和malloc究竟是如何分配内存也有关系
    我这里只粗浅地从模型的角度谈一下一种可能的实现:首先把可用的内存块组织成链表,malloc到这个链表中寻找可用空间,然后修改链表。而free完成的是相反的过程,把不再使用的内存块重新加入到链表。

    欢迎两位版主和其他网友补充

论坛徽章:
0
117 [报告]
发表于 2011-04-26 18:10 |只看该作者
本帖最后由 PCliangtao 于 2011-04-26 18:18 编辑

回复 107# rover12421


     malloc是如何告诉系统你要分配多少的内存?  说话要有根据...malloc只是libc里面的一个库函数. 实际上linux上提供的内存分配函数是sbrk和brk两个系统调用. 严格来说根本不算是内存

    分配函数. 只是扩大程序堆空间的系统调用. 底层具体分配内存的函数系统没有EXPORT出来...只能内核使用.

     而sbrk这样的函数肯定是不好用的. 所以libc里的malloc就在sbrk 上包裹了一层. 来提程序员管理分配及释放内存. 提供简单的调用接口.

     不知道现在的malloc是如何实现的. 只知道以前看过的malloc实现是基于桶的原理的. 它会有很多链表结构来管理空闲块以及分配出去的块. 每个块的开头会有指针.或者其他的记录信息.

     这样有时候malloc一块内存之后. 然后越界写. 然后free.或者malloc的时候有可能就会出现malloc memory corrupted之类的信息导致程序挂调. 这就是因为你把malloc用来管理内存的

     一些记录信息给覆盖调了.  

    为何free能够知道要free多少内存.这个再简单不过了. 比如malloc管理内存可能会以某各大小的内存块的倍数来管理.比如 N 2N 3N...等. 不足N的直接分配N就好了...

    有各种链表来管理分配出去的内存. 等大的内存块大小挂在同一个链表上. 自然就知道大小了.   具体实现也不清楚了...  至少slab是这么干的...原理都差不多.

论坛徽章:
2
技术图书徽章
日期:2013-09-04 15:21:51酉鸡
日期:2013-11-01 21:20:20
118 [报告]
发表于 2011-04-26 23:23 |只看该作者
大侠们,问个问题?
malloc分配完数据空间后,在用free释放的时候,free是怎么知道需要释放多大的空间的。 ...
contiguous 发表于 2011-04-26 09:45


OS获取控制权后,会将内存划分出不同大小的区块。例如申请者,申请一个字节,一般情况下,OS的内存管理程序会分配一个最接近于1字节的块给申请者,而不是只提供1字节内存空间给申请者。
内存管理程序知道哪些内存块被使用了,及这些内存块的大小等一些信息。也就是说,内存管理程序既然批准了内存的使用,自然知道被批准的内存块大小。

论坛徽章:
2
天蝎座
日期:2014-03-28 10:18:052015年亚洲杯之乌兹别克斯坦
日期:2015-02-10 11:32:25
119 [报告]
发表于 2011-04-27 08:25 |只看该作者
malloc.zip (8.57 KB, 下载次数: 18)

openbsd的malloc与free

论坛徽章:
0
120 [报告]
发表于 2011-04-27 19:19 |只看该作者
前面几位网友的发言非常精彩,实在是为本贴增色不少。本人也感到受益匪浅
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP