This question already has answers here:
C Programming: malloc() inside another function
(8个答案)
3年前关闭。
当我想释放该函数内部的内存时,为什么要在我的saferFree(void **)函数中使用指针?为什么下面的代码不释放IP指针?
上面的代码不能释放pp指针,但是下面的带有双指针的代码可以正常工作。我想知道为什么吗?
(8个答案)
3年前关闭。
当我想释放该函数内部的内存时,为什么要在我的saferFree(void **)函数中使用指针?为什么下面的代码不释放IP指针?
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
void saferFree(void *);
int main()
{
int *ip;
ip = (int*) malloc(sizeof(int));
*ip = 5;
saferFree(ip);
return 0;
}
void saferFree(void *pp){
if((void*)pp != NULL){
free(pp);
pp = NULL;
}
}
上面的代码不能释放pp指针,但是下面的带有双指针的代码可以正常工作。我想知道为什么吗?
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
void saferFree(void **);
int main()
{
int *ip;
ip = (int*) malloc(sizeof(int));
*ip = 5;
saferFree(&ip);
printf("%p", ip);
return 0;
}
void saferFree(void **pp){
if(*pp != NULL){
free(*pp);
*pp = NULL;
}
}
最佳答案
FWIW,将NULL传递给free()
是绝对安全的。包装器基本上是没有意义的。
引用C11
,第§7.22.3.3章,(强调我的)
free
函数使ptr
指向的空间被释放,即
可作进一步分配。如果ptr
是空指针,则不执行任何操作。 [..]
就是说,按照您的问题,它可以正常工作,但是由于访问free-d内存是UB,因此您不应该这样做(在调用main()
检查内存是否已在saferFree()
中这样做)释放与否)。另外,也许值得一提的是,函数参数是在C中按值传递的,因此您对pp
本身所做的任何更改(例如:pp = NULL;
)都不会反映到ip
中的main()
。但是,free()
将正常工作。
另外,please see this discussion on why not to cast the return value of malloc()
and family in C
.。
关于c - 为什么我的free()包装函数不起作用? ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38630454/
10-13 21:56