realloc(void *ptr, size_t new_size)
在两种情况下返回NULL
:
我如何知道发生了什么类型的问题?
如果我们内存不足,我可能会将一些内存分页到磁盘。
我如何知道自己是否应该free(ptr)
? (也许它已经被realloc释放了)。
答案 0 :(得分:4)
引自here
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].
答案 1 :(得分:1)
来自http://linux.die.net/man/3/realloc
注意:
UNIX 98标准要求malloc(),calloc()和realloc()在失败时将errno设置为ENOMEM。 Glibc认为这已经完成了(这些例程的glibc版本就是这样做的);如果你使用一个没有设置errno的私有malloc实现,那么某些库例程可能会失败而没有错误的原因。
答案 2 :(得分:1)
我怎么知道我是否应该自由(ptr)? (也许它已经被释放了 通过realloc)
* realloc
可能返回NULL
的唯一现实原因是,当内存不足时,您无能为力。
如果它失败realloc
永远不会释放你的记忆,所以你总是要自己照顾它。
*或者在调用大小为0
时答案 3 :(得分:0)
如果realloc()
失败(返回NULL
),您应该自己free()
指针。唯一需要担心的奇怪案例是the new size is 0。
答案 4 :(得分:0)
如果您内存不足errno
应为ENOMEM
。此外,如果realloc
失败, 将释放您在指针中传递的内存。
答案 5 :(得分:0)
主要 - 它取决于realloc的实现。
一般情况下,你不必释放(ptr),因为realloc从未在第一时间分配它(因此返回NULL)。
要确定realloc是否无法增加堆大小,只需检查ERRNO编号即可。 Malloc / Calloc / Realloc将ERRNO设置为ENOMEM(存储空间不足,可以为请求提供服务)