2009-08-26 8 views
10

Bardzo podobne do my previous question, ale uważam, że jest to oddzielny problem i nie jesteśmy w stanie znaleźć solidnej odpowiedzi na to pytanie.Czy pamięć macierzy (znaków) jest zwalniana przez wyjście poza zasięg?

Czy pamięć używana przez tablicę (znakową) jest zwalniana przez wyjście poza zasięg?

Przykład:

void method1() 
{ 
    char str[10]; 
    // manipulate str 
} 

Więc po wywołaniu method1 jest pamięć używana przez STR (10 bajtów) uwolniony, czy trzeba jawnie wywołać darmo na to, jak dobrze?

Moja intuicja podpowiada mi, że jest to prosty zestaw typów pierwotnych, więc jest automatycznie zwalniany. Mam wątpliwości, ponieważ w C nie można założyć, że cokolwiek zostanie automatycznie uwolnione.

Odpowiedz

18

W tym przypadku nie trzeba dzwonić za darmo. Wartość "str" ​​jest wartością opartą na stosie, która zostanie oczyszczona, gdy ta konkretna metoda/zakres zostanie zakończona.

Wystarczy zadzwonić za darmo na wartości, które są jawnie utworzone za pomocą malloc.

+1

(gdzie "nie" oznacza - tak, jest darmowe, wychodząc poza zakres, i nie musisz dzwonić za darmo jawnie) – jmanning2k

+0

@ jmanning2k ponownie przeczytałem mój wpis i zredagowałem go trochę więcej o tym, co "nie" oznacza – JaredPar

1

Nie, zmienne lokalne tego sortowania są przydzielane na stosie, więc po powrocie z procedury pamięć jest dostępna dla następnego wywołania funkcji, które będzie wykorzystywać pamięć do swojej ramki stosu.

Jeśli używasz malloc(), miejsce jest przydzielane na stercie, które musi zostać jawnie zwolnione.

9

Zostaje on automatycznie zwolniony. Jeśli nie zrobiłeś tego malloc, to nie musisz go zwolnić. Ale nie ma to nic wspólnego z tym, że jest to "prosta tablica typów pierwotnych" - zostałaby uwolniona, gdyby była tablicą struktur. Jest zwalniany, ponieważ jest zmienną lokalną.

Biorąc pod uwagę, że zadajesz te bardzo podstawowe pytania, muszę zapytać, którego podręcznika C używasz. Osobiście nie wierzę, że można z pożytkiem uczyć się C bez czytania czytając Kernighana & Ritchie's The C Programming Language, która wyjaśnia to wszystko bardzo wyraźnie.

+0

Doskonała rada! – Lazarus

+0

Tak naprawdę czytałem (i studiowałem) język programowania C przez K & R, ale to było jakiś czas temu i zanim faktycznie "wszedłem" w C samemu nieco więcej. – pbean

0

Wydaje mi się, że został uwolniony nie dlatego, że jest prymitywami, ale jest lokalną zmienną, która zostanie przydzielona na stosie, a nie na stercie. Jeśli tego nie zrobisz, nie możesz go uwolnić, o ile pamiętam.

0

Tak, jest "uwolniony", gdy wykracza poza zakres.
Nie, nie musisz tego wyraźnie uwalniać.

Tablica znaków jest przydzielana na stosie, więc po powrocie z funkcji przestrzeń stosu jest ponownie użyta. Nie musisz jawnie zwalniać pamięci.

Dobra zasada: jeśli masz malloc, musisz free.

+0

Pytanie dotyczy C, nie C++ –

+0

Ah, tak, rzeczywiście. Pozwól mi to naprawić. –

3

Tak, jest "uwolniony". (Not free() 'ed, though.)

Ponieważ str jest zmienną automatyczną, będzie trwała tak długo, jak jej zasięg, czyli do końca bloku funkcyjnego.

Należy pamiętać, że tylko za darmo() to, co zrobiłeś malloc().

2

Tak, pamięć zostanie zwolniona automatycznie po zwrocie method1. Pamięć do str jest przydzielana na stosie i jest zwalniana po wyczyszczeniu ramki stosu metody. Porównaj to z pamięcią przydzieloną na stercie (przez malloc), którą musisz jawnie zwolnić.

0

Jestem trochę zardzewiały w C/C++ ostatnio, ale myślę, że masz rację. Dopóki dynamicznie nie przydzielono tej pamięci, powinno być dobrze.

Powiązane problemy