在不使用Free()函数的情况下在c中释放内存

在不使用Free()函数的情况下在c中释放内存,c,free,realloc,C,Free,Realloc,我尝试过在不使用free()的情况下释放内存,如下所示 int *ptr = malloc(20); realloc(ptr, 0); 这行得通吗?也许行,但你不能指望它。从文档中: 如果new_size为零,则行为由实现定义(可能返回空指针,或者可能返回一些不用于访问存储的非空指针) C语言标准在这一点上有所不同:在C90中,通过零大小与调用free相同: 如果大小为零,则先前在ptr分配的内存将被释放,就像调用free一样,并返回空指针 但是,C99中的情况发生了变化: 如果size为零,

我尝试过在不使用
free()
的情况下释放内存,如下所示

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

这行得通吗?

也许行,但你不能指望它。从文档中:

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


C语言标准在这一点上有所不同:在C90中,通过零大小与调用
free
相同:

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

但是,C99中的情况发生了变化:

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

请注意,释放已不再是一项要求;当通过零大小时,也不会返回
NULL

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

标准
C11
规定:

如果请求的空间大小为零,则行为由实现定义: 要么返回空指针,要么行为就好像大小为 非零值,但返回的指针不得用于访问 反对

为什么因为
realloc
做了下面的事情

  • 它创建指定大小的新内存
  • 将内容从旧内存复制到新内存
  • 释放旧的记忆
  • 返回新内存的地址

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

    发件人:

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


    来自手动页面:如果大小等于零,并且ptr不为NULL,那么调用相当于free(ptr)@delk:linux手册页不是C标准。我确实改变了我原来在那里的行为,因为我事先不知道这种行为。学习了一些新的东西。为了抓住语言的变化,我没有。我认为这里的总结是:“如果你想自由,那么就使用
    free()
    ,因为你不能依赖
    realloc(0)
    ”。整洁。在C11中它又发生了变化。所以结论是,根据每个人的评论,它取决于C库的实现。@amman059正如上面Oli Charlesworth提到的,最安全的方法是在需要释放内存时调用
    free
    。此更改的另一个结果是,除非您确定编译代码所使用的C语言版本,否则不应调用大小为零的
    realloc
    。它实际上表示传入0的行为是实现定义的。@EdS.True,其实现定义的。答案已编辑。如果你给出不想使用免费的原因,会更好。。。面试问题?请问为什么问题被标记为
    recursion
    marco