2016-07-28 97 views
-2

为什么我要在我的saferFree(void **)函数中使用指向指针的指针?为什么下面的代码does'n免费的IP指针?为什么我的free()包装函数不起作用?

#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; 
    } 
} 
+3

什么不行? –

+1

请显示你看到的部分'。它不释放分配的内存.'有些人感到困惑。 –

+1

我怀疑问题是OP期望指针'ip' main()是'NULL',因为它在'safeFree()'中设置为'NULL'。 'pp'本地于'safeFree()',所以它不会在main()中反映出来。看到这个帖子以及:http://stackoverflow.com/questions/13431108/changing-address-contained-by-pointer-using-function – usr

回答

0

FWIW,将NULL传递给free()是完全安全的。你的包装基本上没有意义。

引用C11,章§7.22.3.3,(重点煤矿

free功能使空间指向ptr被解除分配,即,由 可用于进一步的分配。 如果ptr是空指针,则不会发生任何操作。 [..]


这就是说,按照你的问题,它工作正常,但由于访问免费-d内存UB,你不应该这样做,(你似乎在做main()在调用saferFree()后检查内存是否被释放)。另外,也许值得一提的是函数参数是通过C值传递的,所以您对pp本身(例如:pp = NULL;)所做的任何更改都不会反映到main()中的ip。但是,free()将正常工作。另外,please see this discussion on why not to cast the return value of malloc() and family in C.

+3

这似乎是对我的评论。 – MikeCAT

+2

访问释放的内存在哪里? – usr

+0

@MikeCAT等待OP编辑问题。 :) –