3

realloc(void *ptr, size_t new_size)NULL在两种情况下返回:

  • 如果内存不足,则不释放旧内存块并返回 NULL。
  • 如果发生错误,也会返回 NULL。

我怎么知道发生了什么类型的问题?

如果内存不足,我可能会将一些内存分页到磁盘。

我怎么知道我是否应该这样做free(ptr)?(也许它已经被 realloc 释放了)。

4

6 回答 6

4

从这里引用

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].
于 2013-04-12T07:16:58.627 回答
1

来自http://linux.die.net/man/3/realloc

笔记:

UNIX 98 标准要求 malloc()、calloc() 和 realloc() 在失败时将 errno 设置为 ENOMEM。Glibc 假设这已经完成(并且这些例程的 glibc 版本会这样做);如果您使用未设置 errno 的私有 malloc 实现,则某些库例程可能会在没有 errno 原因的情况下失败。

于 2013-04-12T07:11:30.583 回答
1

我怎么知道我是否应该释放(ptr)?(也许它已经被 realloc 释放了)

realloc*可能返回的唯一现实原因NULL是没有足够的可用内存,而您对此无能为力。

此外,万一它失败了,它realloc永远不会释放你的记忆,所以你总是必须自己处理。


*或者当使用大小 0 调用时

于 2013-04-12T07:11:42.543 回答
0

如果realloc()失败(返回NULL),您应该free()自己指向指针。唯一需要担心的奇怪情况是新大小为 0时。

于 2013-04-12T07:11:20.770 回答
0

如果你内存不足errno应该是ENOMEM。此外,如果realloc失败,它不会释放您传递给它的指针的内存。

于 2013-04-12T07:11:23.703 回答
0

大多数情况下 - 这取决于 realloc 的实现。

但是,一般来说,您不必 free(ptr) 因为 realloc 从来没有首先分配它(因此返回 NULL )。

要确定 realloc 是否无法增加堆大小,只需检查 ERRNO 编号。Malloc/Calloc/Realloc 将 ERRNO 设置为 ENOMEM(存储空间不足可用于服务请求)

于 2013-04-12T07:11:58.820 回答