可能是重复的问题:
C编程:free如何知道要释放多少内存?
您好,
当我有以下代码时:
void *ptr = malloc(100); // alloc 100 bytes
// do sth
free(ptr);
free()函数如何知道需要释放多少空间?
谢谢!
--
好的,我已经找到其他类似的问题,请关闭 - 抱歉。
可能是重复的问题:
C编程:free如何知道要释放多少内存?
您好,
当我有以下代码时:
void *ptr = malloc(100); // alloc 100 bytes
// do sth
free(ptr);
free()函数如何知道需要释放多少空间?
谢谢!
--
好的,我已经找到其他类似的问题,请关闭 - 抱歉。
malloc
实现管理的某个内存区域中。这些信息通常在malloc
向您分配实际内存之前出现,但这是一个实现细节,您不能依赖于此处任何内容。malloc
实现(http://g.oswego.edu/dl/html/malloc.html),当然还有http://en.wikipedia.org/wiki/Malloc(甚至提到了Doug Lea的实现,所以我希望我没有离轨太远... :-) - Dirkmalloc
绝对是CRT函数。操作系统通常不关心堆管理这样微小的事情。它按照内存页(又称虚拟内存)为应用程序分配内存。而这块内存反过来在应用程序中被划分为分区。 - valdofree()
如何知道要释放多少空间,所以不可避免地需要将操作系统带入主题,而不仅仅是malloc
的实现。 - Luca Matteissbrk
、mmap
、int 21h
、VirtualAllocEx
或任何系统调用来分配原始内核,这是系统操作系统提供/要求的。请注意,处理对齐不一定仅仅是性能问题,而在许多系统上也是确保正确功能所必需的。 - Dirk这是实现依赖性的,但通常底层系统有一个地址到块的映射表,并且它从该内存映射中知道大小。
下面是来自glibc的简化代码,它基本上展示了我刚才所说的。
void fREe(Void_t* mem)
{
arena *ar_ptr;
mchunkptr p;
if (__free_hook != NULL) {
(*__free_hook)(mem, NULL);
}
if (mem == 0) /* free(0) has no effect */
return;
p = mem2chunk(mem);
if (chunk_is_mmapped(p)) /* release mmapped memory. */
{
munmap_chunk(p);
return;
}
ar_ptr = arena_for_ptr(p);
chunk_free(ar_ptr, p);
(void)mutex_unlock(&ar_ptr->mutex);
}