2015-08-19 28 views
6

Nauczyłem się w książce, że jeśli potrzebuję zwrócić wskaźnik z funkcji, używam malloc() i otrzymuję pamięć ze sterty. Zastanawiam się, jak mogę free() up pamięci przydzielonej po funkcji."malloc w funkcji lokalnej, wolna pamięć w magistrali" czy jest ok? W jaki sposób?

Czy mogę zrobić to, co zrobiłem w poniższym kodzie, aby zwolnić pamięć? Jeśli nie jest poprawny, jaki jest właściwy sposób na zwolnienie pamięci po funkcji?

int *Add_them_up (int *x, int *y) 
{ 
    int *p = (int *) malloc(sizeof (int)); 
    *p = *x + *y; 
    return p; 
} 


int main() 
{ 
    int c = 3; 
    int d = 4; 
    int *presult = NULL; 
    presult = Add_them_up (&c, &d); 
    printf ("the result of adding is:%d\n", *presult); 
    free (presult); 
    return 0; 
} 
+3

Proszę [zobacz, dlaczego nie przesyłać] (http://stackoverflow.com/q/605845/2173917) zwracanej wartości 'malloc()' i rodziny w 'C'. –

+0

@shinhwa jest tu poważny problem, którego tu brakuje. –

+0

@SouravGhosh Zignorowałeś poważny problem, mój przyjacielu. –

Odpowiedz

6

Tak, Twój kod jest prawidłowy. warunek zastosowania, patrz uwaga poniżej

Aby free() przydzieloną pamięć, trzeba tylko przejść zwrócony wskaźnik od malloc() i rodziny.

Jak dostajesz ten sam wskaźnik zwracany przez malloc() powrotnej z funkcji Add_them_up() i przechowywanie samo w presult w main() można nazwać

free (presult); 

bez żadnych problemów. Wykona zamierzoną pracę.


Uwaga: Brakuje tu dwóch aspektów, np.

  1. Proszę see why not to cast wartość zwracana malloc() i rodziny w C.
  2. Przed użyciem zwracanego wskaźnika należy zawsze sprawdzić, czy odniósł sukces w postaci malloc().

Powiedział, że tylko sugestia, zawsze starają się skorzystać z formularza

int *p = malloc(sizeof(*p)); 

co sprawia, że ​​oświadczenie przydział niezależne od rodzaju p, w wyniku czego najbardziej solidnego kodu.

+1

dzięki za uwagi i wyjaśnienia. Zrozumiałem drugi aspekt, uczę się pierwszego. – shinhwa

+0

Kod jest poprawny pod względem składni i funkcjonalności, ale jest to zły projekt programu. – Lundin

3

Jest to ogólnie uważane za kiepski projekt programu. Moduł, który wykonuje funkcję malloc() powinien być zaprojektowany tak, aby był również odpowiedzialny za wykonanie funkcji free().

Nigdy nie powinieneś projektować programów, aby pewna zewnętrzna procedura miała usunąć bałagan z twojego modułu. To wszystko ma zdrowy rozsądek.

Tak więc w tym przypadku powinieneś dodać funkcję otoki wokół funkcji free(), którą funkcja main() może wywołać. main() nie powinien potrzebować znać lub dbać o to, jak twoje procedury wykonują dynamiczną alokację/dealokację.

Należy zauważyć, że programy, które nie są zgodne z tym projektem programu, zwykle mają błędy związane z wyciekaniem pamięci.

+0

Dobrze powiedziane, także myślę, że został jeden problem pominięty. –

+1

@ Sumeet Zwisające wskaźniki to tylko problem, jeśli oczekuje się, że procedury będą wywoływane ponownie z tymi samymi wejściami. W takim przypadku to zależy od procedur, które obsługują to malloc/free. – Lundin

+0

Ale nadal czyniąc to NULL jest dobrą rzeczą do zrobienia, nie sądzisz. –

Powiązane problemy