在不使用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
?