为什么我的free()包装函数不起作用?

时间:2016-07-28 08:02:59

标签: c function pointers free

当我想在该函数中释放内存时,为什么我应该在我的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;
    }
}

1 个答案:

答案 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.