可能重复:
How is heap and stack memories managed, implemented, allocated?
您好, 我的问题是关于堆,而不是数据结构,而是用于动态内存分配的内存区域。
假设我们正在用C(或者C ++)编写一个程序,并且在其代码深处的某个地方调用malloc()(或者在C ++的情况下调用operator new)。现在分配内存的位置是什么?编译器(链接器?)是否添加了用作堆的数据段?该部分的规模如何确定?如果我们尝试分配一块比整个“堆段”更大的内存,会发生什么?堆扩展了吗?如果是,怎么样?
答案 0 :(得分:3)
操作系统分配页面,然后返回到malloc / free,然后从内存中将这些页面分解为所请求大小的块。操作系统可以在用户的地址空间中分配尚未请求的任何页面。没有堆段。分配的内存位于操作系统确定的任何位置。
答案 1 :(得分:0)
旧的unix实现使用机制sbrk()
- 移动最后数据部分边界的系统请求。分配内存时,tuntime库会调用system来向上移动数据边界,并使用新的内存。
新的操作系统使用虚拟内存,因此malloc会在必要时从系统中请求新的免费VM页面。
独立应用程序(在裸硬件,微控制器等上运行)都已分配内存。库知道所有内存,因为链接器脚本定义了动态区域的符号。 E. g。类似freemembot
和freememtop
的内容,用于最低和最高可用内存区域位置。
答案 2 :(得分:0)
描述了dlmalloc的内部工作原理(glibc,uClibc和许多其他地方使用的malloc()实现)here。
类似Unix的操作系统有两个用于请求/释放内存的主要接口:Windows API实际上是malloc()/ free()之类,其功能类似于HeapAlloc()/ HeapFree()。