2015-05-01 21 views
13

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); 
} 
+4

tak, to uwalnia pamięć przeznaczoną dla x –

+9

[Nie rzucaj 'malloc()' (lub 'calloc()')!] (Http://stackoverflow.com/a/605858/3488231) – ace

+0

@AndreyChernukha, Odpowiedź na to jest [to zależy] (http://stackoverflow.com/a/30000348/3049655). (Wysłałeś ten komentarz * przed * zmianą OP) –

Odpowiedz

18

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.

+0

Byłoby miło, gdyby dodać, że to nie działa, jeśli 'y' jest ponownie przypisany do innej lokalizacji pamięci. – haccks

+0

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

+0

@haccks, Gotowe :) –

5

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.

+0

'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

+2

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

0

Pamięć zwrócona przez wywołanie calloc() jest zwalniana przez wywołanie free().

W kodzie, który dotyczy zarówno x i y.

1

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.

Powiązane problemy