realloc如何处理内存不足的情况?

问题描述 投票:0回答:3

如果原始位置没有足够的可用内存:

  • 它是否分配多个内存块并返回指向其中一个内存块的指针,并且所有块都在内部相互链接?
  • 原始区域是否被复制到有足够内存可用的新位置?
  • 是否返回了指向新地址的指针,而旧位置的内存被释放了?

realloc
是否依赖于编译器/操作系统?

c memory-management realloc
3个回答
30
投票
如果堆上有足够的可用内存,

realloc
会尝试扩展可用内存范围。如果不是,那么它相当于
malloc
新大小的块,
memcpy
那里的内容,
free
旧块。这与操作系统和编译器无关,并且取决于您链接的
libc
的实现。

类似的说明:

mremap/MREMAP_MAYMOVE
(在现代 Linux 上可用)将尝试按请求的大小扩展虚拟映射。如果这是不可能的,那么它将把您的映射移动到一个新的虚拟地址,该地址后面有足够的虚拟机空间,然后扩展您的映射。如果您经常调整大型映射的大小,由于没有进行物理复制,这会非常快。


20
投票

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()
接口是通用的。


5
投票

如果旧指针无法在分配新指针的位置调整大小,则会复制内容并释放旧指针。

© www.soinside.com 2019 - 2024. All rights reserved.