2014-10-04 32 views

Odpowiedz

15

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.

+0

Tak, rzeczywiście dotyczy to obszaru. Dzięki! – user3772839

17

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 *.

+1

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

1

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.

+3

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

+0

Zobacz http://yarchive.net/comp/const.html dla rant Linusa Torvaldsa. – hmp

+0

MicroVirus, czytaj melodie Linusa, wyjaśnia to lepiej, jak tylko potrafię i ma rację. –