Memory 堆-如何跟踪空闲字节?

Memory 堆-如何跟踪空闲字节?,memory,heap,tracking,free,Memory,Heap,Tracking,Free,我正在阅读关于堆和堆栈使用的文章,我对堆和动态分配的内存有一个问题 应用程序使用的堆内存如何/在何处使用或可用? 我在动态分配的解释中经常看到这样的情况: int *p; p = (int*)malloc(sizeof(int));/* A space in the heap is allocated to store an int*/ p = (int*)malloc(sizeof(int));/* p now points to another space in the heap ; the

我正在阅读关于堆和堆栈使用的文章,我对堆和动态分配的内存有一个问题

应用程序使用的堆内存如何/在何处使用或可用?

我在动态分配的解释中经常看到这样的情况:

int *p;
p = (int*)malloc(sizeof(int));/* A space in the heap is allocated to store an int*/
p = (int*)malloc(sizeof(int));/* p now points to another space in the heap ; the first allocated space is lost, causing a memory leak*/
我理解代码中写的/*注释*/但我不清楚第一个空格是否“丢失”,因此我提出了两个想法:

  • 每次动态分配时,“某物”必须跟踪内存中保留的空间(第一个字节的地址和分配的空间大小):类似于在每次动态分配时更新的列表
  • 或者每个字节都有某种标志,表示它是自由的或由应用程序使用
这样,对free函数的调用将通过删除字节地址来更新列表,对于第二个,则通过更改标志来更新列表


谢谢您的时间。

分配器可能会在分配的内存中预先添加一小段描述分配的数据,如大小。但是,这实际上取决于分配器的实现。
p
丢失,因为应用程序不再有方法返回第一个指针值,因此无法对第一个分配的块调用
free()
。堆管理器对此一无所知——它看到的只是一个正在使用且无法重用的已分配块。因此,第一个块是一个泄漏-它永远不会被释放,但不再被使用。是的,堆管理器有一些结构(当然是在内存中)来跟踪已用/可用空间。它通常是一个链表,但也可以是使堆管理快速高效的任何结构。