【发布时间】:2014-03-15 16:07:26
【问题描述】:
我尝试过在不使用free() 的情况下释放内存,如下所示
int *ptr = malloc(20);
realloc(ptr, 0);
会有用吗?
【问题讨论】:
-
如果你能给出你为什么不想使用免费的理由会更好...面试问题?
-
请问为什么这个问题被标记为
recursion和marco?
我尝试过在不使用free() 的情况下释放内存,如下所示
int *ptr = malloc(20);
realloc(ptr, 0);
会有用吗?
【问题讨论】:
recursion 和marco?
C 语言标准在这一点上有所不同:在 C90 中传递零大小与调用 free 相同:
如果 size 为零,之前在 ptr 分配的内存将被释放,就像调用 free 一样,并返回一个空指针。
但是,这在 C99 中发生了变化:
如果 size 为零,则返回值取决于特定的库实现:它可能是空指针或其他不应取消引用的位置。
请注意,不再需要释放;当传递零大小时,两者都不会返回NULL。
【讨论】:
free(),因为你不能依赖realloc(0)”。
free。此更改的另一个后果是,除非您确定编译代码所使用的 C 语言版本,否则不应调用大小为零的 realloc。
realloc(ptr, 0) 不等同于free(ptr)
标准C11 说:
如果请求的空间大小为零,则行为是实现定义的: 要么返回一个空指针,要么行为就像大小是一些 非零值,除了返回的指针不得用于访问 目的。
为什么是因为realloc 做了下面的事情,
【讨论】:
也许,但你不能指望它。来自文档:
如果 new_size 为零,则行为由实现定义(可能会返回空指针,或者可能会返回一些可能不用于访问存储的非空指针)。
【讨论】:
至少对于 POSIX:realloc(p, 0) 与 free(p) 不同。
来自the current POSIX documentation on realloc():
以前的版本明确允许调用 realloc (p, 0) 以释放 p 指向的空间并返回一个空指针。虽然这种行为可以解释为该版本的标准允许,但 C 语言委员会表示这种解释是不正确的。
【讨论】: