![]() |
1
299
当你打电话
当你打电话
|
![]() |
2
120
大多数C内存分配函数的实现将为每个块存储记帐信息,可以是在线的,也可以是单独的。 一种典型的方法(内联)是实际分配一个头部和所需的内存,将其填充到最小的大小。例如,如果您要求20个字节,系统可能会分配一个48字节的块:
然后提供给您的地址是数据区域的地址。然后,当你放开这个街区的时候,
请记住,头和填充的大小完全是实现定义的(实际上,整个内容都是实现定义的) (a) 但在线会计选择是一种常见的选择)。 会计信息中存在的校验和和特殊标记通常是导致错误的原因,如“内存领域损坏”或“双重释放”,如果您覆盖或释放它们两次。 填充(为了使分配更有效)是为什么您有时可以在请求的空间末尾写一点,而不会造成问题(但是,不要这样做,这是未定义的行为,而且,仅仅因为它有时工作,并不意味着可以这样做)。
(a)
我已经写了
我开发的其他程序有16字节块、64字节块、256字节块和1K块的不同池,同样使用位掩码来决定使用或可用的块。
这两种选择都设法减少了会计信息的开销,并提高了
|
![]() |
3
45
从
malloc/free实现在分配时记住每个块的大小,因此在释放时不必提醒它大小。(通常,大小存储在分配的块附近,这就是为什么如果分配的块的边界甚至稍微超出了一点,事情通常会严重中断的原因) |
![]() |
4
6
此答案从 How does free() know how much memory to deallocate? 我被一个明显重复的问题打断了回答。该答案应与本副本相关:
对于这种情况
试图
|
![]() |
6
3
更多信息 on this other question . |
![]() |
7
2
当调用时,堆管理器将属于已分配块的内存量存储在某个位置
我自己从来没有实现过一个,但我猜在分配的块前面的内存可能包含元信息。 |
![]() |
8
2
最初的技术是分配一个稍大的块并在开始时存储大小,然后将博客的其余部分交给应用程序。额外的空间可以容纳一个大小和链接,将自由块连接在一起以便重用。 但是,这些技巧存在一些问题,例如缓存和内存管理行为不佳。在块中正确地使用内存会导致不必要地分页,并且还会创建脏页,这会使共享和写时复制复杂化。 所以更先进的技术是保持一个单独的目录。在内存区域使用两种大小相同的能力的情况下,也开发了一些奇特的方法。 一般来说,答案是: 分配一个单独的数据结构来保持状态。 |
![]() |
9
1
回答你问题的后半部分:是的,你可以,在C中一个相当常见的模式是:
|
![]() |
10
0
当我们调用malloc时,它只需要根据需要消耗更多的字节。更多的字节消耗包含诸如校验和、大小和其他附加信息等信息。 当我们在那个时候调用free时,它直接转到附加信息,在那里可以找到地址,还可以找到有多少块是空闲的。 |
![]() |
Fishie · 作为类成员的智能指针是否仍然自动释放?[关闭] 6 月前 |
![]() |
Anka Hanım · 关于结构和动态数组地址的问题 6 月前 |
![]() |
tTt · 使用堆栈中的值重新分配指针 7 月前 |
![]() |
manuel · 现代C中空指针的替代方案++ 8 月前 |