如何知道我们是否内存不足或使用realloc()时出错?

时间:2013-04-12 07:07:49

标签: c realloc

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

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

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

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

我如何知道自己是否应该free(ptr)? (也许它已经被realloc释放了)。

6 个答案:

答案 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(存储空间不足,可以为请求提供服务)