2016-07-28 39 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編輯問題。 :) –

相關問題