c中的空闲内存,不使用free()函数

时间:2014-02-16 12:05:12

标签: c free realloc

我尝试过释放内存而不使用free(),如下所示

int *ptr = malloc(20);
realloc(ptr, 0);

它会起作用吗?

4 个答案:

答案 0 :(得分:12)

C语言标准在这一方面有所不同:在C90中传递零大小与调用free相同:

  

如果size为零,则先前在ptr分配的内存将被释放,就像调用free一样,并返回空指针。

然而,这在C99中发生了变化:

  

如果size为零,则返回值取决于特定的库实现:它可以是空指针或其他不应被解除引用的位置。

请注意,不再需要释放;当零尺寸通过时,两者都没有返回NULL

答案 1 :(得分:2)

realloc(ptr, 0)不等同于free(ptr)

标准C11说:

  

如果请求的空间大小为零,则行为是实现定义的:       返回空指针,或者行为就像大小一样       非零值,但返回的指针不得用于访问       宾语。

为什么因为realloc做了以下事情,

  1. 它创建指定大小的新内存。
  2. 将旧内存中的内容复制到更新。
  3. 释放旧记忆
  4. 返回新内存的地址

答案 2 :(得分:1)

也许,但你不能指望它。来自文档:

  

如果new_size为零,则行为是实现定义的(可能返回空指针,或者可能返回一些可能不用于访问存储的非空指针)。

答案 3 :(得分:0)

至少对于POSIX:realloc(p, 0)free(p)不同。

来自the current POSIX documentation on realloc()

  

以前的版本明确允许调用 realloc(p,0)来释放p指向的空格并返回空指针。虽然此行为可能被解释为此版本标准允许,但C语言委员会已表明此解释不正确