Czy następujący kod zwalnia pamięć przydzieloną dla x
?Usunąć przypisany wskaźnik
int main()
{
char *x = (char*)calloc(100, sizeof(char));
char *y = x;
free(y);
}
Czy następujący kod zwalnia pamięć przydzieloną dla x
?Usunąć przypisany wskaźnik
int main()
{
char *x = (char*)calloc(100, sizeof(char));
char *y = x;
free(y);
}
Tak
Kiedy robisz
char *y = x;
dokonać y
wskaż lokalizację, w której x
punkty. Od y
punktów do miejsca pamięci zwróconego przez calloc
,
free(y);
jest całkowicie poprawny.Jako @hacckscommented, to nie zadziała, jeśli sprawisz, że y
wskaże inną lokalizację w pamięci, pod warunkiem, że ta lokalizacja pamięci nie została zwrócona przez malloc
/calloc
/realloc
.
W języku C, ty should not cast the result of malloc
/calloc
/realloc
. Również sprawdzenie wartości zwracanej calloc
, aby sprawdzić, czy odniosło sukces, jest dobre. calloc
zwróci NULL
po awarii.
Byłoby miło, gdyby dodać, że to nie działa, jeśli 'y' jest ponownie przypisany do innej lokalizacji pamięci. – haccks
Technicznie, 'free (NULL)' jest legalne i no-op, więc w tym wyjątkowo uproszczonym przykładzie, kod OP jest idealnie czysty, nie sprawdzając wartości zwracanej. – Kevin
@haccks, Gotowe :) –
Oryginalna wersja pytanie miał
int *y = x;
free(y);
Tj przypisanie wskaźnika char
do wskaźnika int
, a następnie wywołanie free()
na wskaźniku int
. Sygnatura free()
to void free(void *ptr);
, więc niezależnie od numeru char *
w porównaniu do int *
pamięć zostanie zwolniona.
Edytowany (i obecny) wersja pytanie ma
char *y = x;
free(y);
Tutaj zarówno y
i x
punkty na tej samej pamięci. Jest to znane jako aliasing wskaźnika. Po wywołaniu free()
pamięć ta zostanie z pewnością zwolniona.
Problemem jest jednak to, że po free(y)
, wskaźnik x
byłoby zwisające, czyli pamięć to wskazuje nie jest już ważna.
Uwaga: nie jest konieczne ani zalecane oddawanie wartości zwracanej z calloc
.
'char * x = ...; int * y = x; 'prowokuje niezdefiniowane zachowanie, z powodu przypisania do niekompatybilnego typu wskaźnika. Potem wszystko może się zdarzyć. Tak więc prawidłowa odpowiedź brzmi "* Być może. *". – alk
Przypisanie "do niezgodnego typu wskaźnika" samo w sobie nie powoduje niezdefiniowanego zachowania. Niezdefiniowane zachowanie powoduje, że wskaźnik niekompatybilnego typu jest dereferencjonowany. Kod w oryginalnej wersji pytania nie spełniał tego, więc nie wykazywał niezdefiniowanego zachowania. – Peter
Pamięć zwrócona przez wywołanie calloc()
jest zwalniana przez wywołanie free()
.
W kodzie, który dotyczy zarówno x
i y
.
Tak, robi.
Ta metoda to void free(void *ptr)
, a następnie po utworzeniu char* y = x
wyświetlany jest wskaźnik do tej samej pamięci, którą wskazał y
.
To pozwoli ci uwolnić tę przestrzeń później z free (y)
.
Jednak można umieścić x = NULL
, ponieważ teraz x
nie ma własnego miejsca, mimo że ma wartość.
Więcej informacji na temat bezpłatnego odczytu here.
tak, to uwalnia pamięć przeznaczoną dla x –
[Nie rzucaj 'malloc()' (lub 'calloc()')!] (Http://stackoverflow.com/a/605858/3488231) – ace
@AndreyChernukha, Odpowiedź na to jest [to zależy] (http://stackoverflow.com/a/30000348/3049655). (Wysłałeś ten komentarz * przed * zmianą OP) –