当我想在该函数中释放内存时,为什么我应该在我的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;
}
}
答案 0 :(得分:0)
FWIW,将NULL传递给free()
是完全安全的。你的包装基本没有意义。
引用C11
,章节§7.22.3.3,(强调我的)
free
函数导致ptr
指向的空间被释放,即 可供进一步分配。 如果ptr
是空指针,则不会执行任何操作。 [..]
那说,根据你的问题,它工作正常,但因为访问free-d内存是UB,你不应该这样做(你在调用{{1}后似乎在main()
中这样做了检查内存是否被释放。)另外,也许值得一提的是函数参数是通过C中的值传递的,因此您对saferFree()
本身所做的任何更改(例如:pp
)都不会反映在pp = NULL;
中ip
1}}。 main()
会正常工作。
另外,please see this discussion on why not to cast the return value of malloc()
and family in C
.。