pracuję nad konwertowania wielu programów C Unix Linux i tym free() składni przykuł moją uwagę:free() składnia z argumentów w C
free((char *) area);
Jaka jest różnica między tym i free(area);
?
pracuję nad konwertowania wielu programów C Unix Linux i tym free() składni przykuł moją uwagę:free() składnia z argumentów w C
free((char *) area);
Jaka jest różnica między tym i free(area);
?
Jeśli ktoś zapisywał wskaźnik do danych przydzielonych dynamicznie w typie bez wskaźnika objętym sankcją standardową, tj. area
został zadeklarowany jako intptr_t
, na przykład rzutuje wskaźnik na typ wskaźnika i pozwala na jego zwolnienie .
Jeśli area
jest już typem wskaźnika, nie ma to żadnego sensu z żadnym kodem napisanym w ostatnim ćwierćwieczu.
Podpis free
jest:
void free(void *ptr);
Więc jeśli area
to rodzaj wskaźnika, który jest zwracany przez malloc
lub jej kuzynów, konwersja w free((char *) area);
jest bezcelowe.
Chyba że ... jeśli kod jest naprawdę, naprawdę stary, to znaczy przed ANSI C wprowadził void *
jako wskaźnik ogólny. W tym starożytnym okresie jako wskaźnik ogólny użyto char *
.
Rzeczywiście, kod jest nieco stary, około 1990 roku, napisany dla starych systemów Unix w tamtych czasach. obszar to wskaźnik w elemencie struktury zadeklarowanym jako int. Dzięki. – user3772839
Podpis free()
w standardzie jest nieprawidłowy. To powinno być void free(const void *);
, aby było naprawdę poprawne. To powoduje, że musisz upcastować const *
, kiedy chcesz go uwolnić bez ostrzeżenia.
Istnieje a Linus Torvald rant about on why free()
should take a const *
.
EDYCJA: Podstawową ideą, dla której kwestia jest kontrowersyjna, jest fakt, że ogólnie ludzie uważają, że const
ma wpływ na pamięć wskazywaną przez wskaźnik, tj. Że wskaźnik wskazuje na pamięć tylko do odczytu. To jest oczywiście fałszywe. Kwalifikacja const
jest własnością wskaźnika, a nie rzeczy, na którą wskazuje. To ważne rozróżnienie.
Nie jestem o tym przekonany. 'malloc' zwraca wartość stałą, więc z jednej strony musisz mieć rzutowanie pomiędzy' malloc' i 'free', aby było to potrzebne. Po drugie, "const" oznacza umowę, co oznacza, że nie modyfikuje się zawartości wskazanej pamięci. "wolne", że pamięć jest naruszeniem tej umowy. Nie mogę myśleć o żadnych argumentach, więc zainteresowałbym się argumentami, które są pro-const. – MicroVirus
Zobacz http://yarchive.net/comp/const.html dla rant Linusa Torvaldsa. – hmp
MicroVirus, czytaj melodie Linusa, wyjaśnia to lepiej, jak tylko potrafię i ma rację. –
Tak, rzeczywiście dotyczy to obszaru. Dzięki! – user3772839