为了账号安全,请及时绑定邮箱和手机立即绑定

自由如何知道有多少自由?

自由如何知道有多少自由?

C++ C
跃然一笑 2019-06-20 16:25:06
自由如何知道有多少自由?在C编程中,您可以将任何类型的指针作为参数传递给空闲,它如何知道分配给空闲的内存的大小?每当我传递指向某个函数的指针时,我也必须传递大小(即由10个元素组成的数组需要接收10个作为参数才能知道数组的大小),但我不必将大小传递给空闲函数。为什么不呢?我可以在我自己的函数中使用同样的技术来避免在数组长度的额外变量周围移动吗?
查看完整描述

3 回答

?
猛跑小猪

TA贡献1858条经验 获得超8个赞

当你打电话malloc(),指定要分配的内存量。实际使用的内存量略高于此,并包含额外的信息,这些信息记录(至少)块的大小。您不能(可靠地)访问其他信息-而且您也不应该:-)。

当你打电话free()它只需查看额外的信息,就可以了解块有多大。


查看完整回答
反对 回复 2019-06-20
?
GCT1015

TA贡献1827条经验 获得超4个赞

C内存分配函数的大多数实现将存储每个块的记帐信息,无论是在线的还是单独的。

一种典型的方式(在线)是实际分配一个头和你想要的内存,填充到最小的大小。例如,如果您请求20个字节,系统可能会分配一个48字节的块:

  • 16字节头,包含大小、特殊标记、校验和、指向下一个/前一个块的指针等。
  • 32字节数据区域(20个字节被填充到16的倍数)。

然后提供给您的地址是数据区域的地址。然后,当你解放了这个街区,free只需取下你给它的地址,假设你没有把地址或它周围的内存塞满,就在它前面检查会计信息。从图形上看,这将遵循以下方针:

 ____ The allocated block ____
/                             \
+--------+--------------------+
| Header | Your data area ... |
+--------+--------------------+
          ^
          |
          +-- The address you are given

请记住头部的大小和填充是完全定义的(实际上,整个事情都是由实现定义的)。(A)但在线会计选项是常见的)。

会计信息中存在的校验和以及特殊标记常常是导致错误的原因,如“内存场损坏”或“双空闲”(如果您覆盖它们或释放它们两次)。

填充(使分配更有效)是为什么有时可以在请求空间的末尾写一点内容而不会引起问题(尽管如此,不要这样做,这是未定义的行为,仅仅因为它有时工作,并不意味着可以这样做)。


(A)我编写了malloc在嵌入式系统中,不管您想要什么(这是系统中最大结构的大小),只要您请求128字节或更少(请求更多将满足空返回值),就会得到128个字节。使用一个非常简单的位掩码(即不在线)来决定是否分配了128字节块。

我开发的其他程序也有不同的池,用于16字节块、64字节块、256字节块和1K块,同样使用位掩码来决定所使用或可用的块。

这两个选项都设法减少了会计信息的开销,并提高了mallocfree(解放时不需要合并相邻的区块),特别是在我们工作的环境中。


查看完整回答
反对 回复 2019-06-20
?
守着星空守着你

TA贡献1799条经验 获得超8个赞

comp.lang.c常见问题清单:免费如何知道要释放多少字节?

malloc/free实现在分配时会记住每个块的大小,因此没有必要在释放时提醒它大小。(通常情况下,大小存储在分配块的旁边,这就是为什么如果分配的块的边界稍微超出一些,通常情况就会严重中断)。


查看完整回答
反对 回复 2019-06-20
  • 3 回答
  • 0 关注
  • 367 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信