在C ++中, operator new
如何保存分配内存的信息? AFAIK,它不能用于恒定时间并且必须在堆中搜索空闲内存。或者,也许,它不是关于C ++,而是关于OS?
P.S。我不知道它是否由标准指定,是由OS还是由C ++管理,但实际上它是如何实现的?
答案 0 :(得分:2)
new通常是在malloc / free的基础上实现的。
malloc / free如何实现它?答案是:这取决于实施。令人惊讶的是:Malloc经常无法跟踪分配的块!唯一的事情,malloc大部分时间都在做,就是添加一些包含块大小的信息"之前"分配的块。这意味着,当你分配40个字节时,它将分配44个字节(在32位机器上)并在前4个字节中写入大小。它会将此块的地址+4返回给您。
Malloc / free跟踪空闲列表。 freelist是一个释放的内存块列表,它尚未(还)返回给操作系统。当需要一个新块时,当一个拟合块可用时,Malloc会搜索空闲列表。
但是关于malloc / free的一个更令人筋疲力尽的答案,我在这里给出了: How do malloc() and free() work?
另外一条信息:
事实的一个含义是,许多分配器都没有跟踪已分配的块:当你通过free或delete返回内存并传入一个指针时,之前没有分配,你将损坏你的堆,因为系统无法检查指针是否有效。关于它的真正丑陋的是,在这种情况下,你的程序不会立即转储,但是在错误原因发生之后的任何时候......因此这个错误真的很难找到。这是一个原因,C / C ++中的内存处理非常困难!
答案 1 :(得分:2)
没有简单,标准的答案。 operator
new
/ operator delete
的大多数实现最终转发到malloc
/ free
,但有一个
许多不同的算法可以用于那些。这是唯一的事情
或多或少普遍的是,分配通常会分配一点点
超过要求,并使用额外的内存(通常在地址前面
实际返回)保持一些额外的信息:要么是实际的
分配的大小或指向块结尾的指针(或下一个的开头)
块)。除了一些算法将保持相同大小的分配
在一起,并能够从地址确定大小。没有
回答你的问题。
答案 2 :(得分:0)
new维护数据结构以跟踪单独分配的块。有很多方法可以做到这一点。通常,使用某种链表。
这里有small article来说明这一点。