2016-07-28 2 views
-2

Почему я должен использовать указатель на указатель в моей функции safferFree (void **), когда я хочу освободить память внутри этой функции? Почему под кодом нет свободного 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

Пожалуйста, покажите часть, где вы увидите «.It не освобождает выделенную память». Некоторые люди путаются. –

+1

Я подозреваю, что проблема в OP ожидает, что указатель 'ip' main() будет' NULL', потому что он установлен в 'NULL' в' safeFree() '. '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;), не будет отражено в ip в main(). 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 отредактирует вопрос. :) –

Смежные вопросы