This question already has answers here:
C Programming: malloc() inside another function
                                
                                    (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