如果原始位置没有足够的可用内存:
realloc
是否依赖于编译器/操作系统?
realloc
会尝试扩展可用内存范围。如果不是,那么它相当于 malloc
新大小的块, memcpy
那里的内容, free
旧块。这与操作系统和编译器无关,并且取决于您链接的 libc
的实现。
类似的说明:
mremap/MREMAP_MAYMOVE
(在现代 Linux 上可用)将尝试按请求的大小扩展虚拟映射。如果这是不可能的,那么它将把您的映射移动到一个新的虚拟地址,该地址后面有足够的虚拟机空间,然后扩展您的映射。如果您经常调整大型映射的大小,由于没有进行物理复制,这会非常快。
realloc()
的实现可能如下所示:
void * realloc(void *ptr, size_t size)
{
// realloc() on a NULL pointer is the same as malloc().
if (ptr == NULL)
return malloc(size);
size_t oldsize = malloc_getsize(ptr);
// Are we shrinking an allocation? That's easy.
if (size < oldsize) {
malloc_setsize(ptr, size);
return ptr;
}
// Can we grow this allocation in place?
if (malloc_can_grow(ptr, size)) {
malloc_setsize(ptr, size);
return ptr;
}
// Create a new allocation, move the data there, and free the old one.
void *newptr = malloc(size);
if (newptr == NULL)
return NULL;
memcpy(newptr, ptr, oldsize);
free(ptr);
return newptr;
}
请注意,我在这里调用了几个名称以
malloc_
开头的函数。据我所知,这些函数实际上在任何实现中都不存在;它们旨在作为占位符,但分配器实际上在内部执行这些任务。
由于
realloc()
的实现依赖于这些内部工具,因此它的实现依赖于操作系统。然而,realloc()
接口是通用的。
如果旧指针无法在分配新指针的位置调整大小,则会复制内容并释放旧指针。