realloc(void *ptr, size_t new_size)
NULL
在两种情况下返回:
- 如果内存不足,则不释放旧内存块并返回 NULL。
- 如果发生错误,也会返回 NULL。
我怎么知道发生了什么类型的问题?
如果内存不足,我可能会将一些内存分页到磁盘。
我怎么知道我是否应该这样做free(ptr)
?(也许它已经被 realloc 释放了)。
从这里引用
RETURN VALUE
Upon successful completion with a size not equal to 0, realloc() returns a pointer
to the (possibly moved) allocated space. If size is 0, either a null pointer or a
unique pointer that can be successfully passed to free() is returned. If there is
not enough available memory, realloc() returns a null pointer and sets errno to
[ENOMEM].
来自http://linux.die.net/man/3/realloc
笔记:
UNIX 98 标准要求 malloc()、calloc() 和 realloc() 在失败时将 errno 设置为 ENOMEM。Glibc 假设这已经完成(并且这些例程的 glibc 版本会这样做);如果您使用未设置 errno 的私有 malloc 实现,则某些库例程可能会在没有 errno 原因的情况下失败。
我怎么知道我是否应该释放(ptr)?(也许它已经被 realloc 释放了)
realloc
*可能返回的唯一现实原因NULL
是没有足够的可用内存,而您对此无能为力。
此外,万一它失败了,它realloc
永远不会释放你的记忆,所以你总是必须自己处理。
*或者当使用大小 0 调用时
如果realloc()
失败(返回NULL
),您应该free()
自己指向指针。唯一需要担心的奇怪情况是新大小为 0时。
如果你内存不足errno
应该是ENOMEM
。此外,如果realloc
失败,它不会释放您传递给它的指针的内存。
大多数情况下 - 这取决于 realloc 的实现。
但是,一般来说,您不必 free(ptr) 因为 realloc 从来没有首先分配它(因此返回 NULL )。
要确定 realloc 是否无法增加堆大小,只需检查 ERRNO 编号。Malloc/Calloc/Realloc 将 ERRNO 设置为 ENOMEM(存储空间不足可用于服务请求)