Czy free (ptr), gdzie ptr ma wartość NULL, powoduje uszkodzenie pamięci?
Teoretycznie mogę to powiedzieć
free(ptr);
free(ptr);
jest to uszkodzenie pamięci, ponieważ zwalniamy pamięć, która została już zwolniona.
Ale co gdyby ...
free(ptr);
ptr=NULL;
free(ptr);
Ponieważ system operacyjny będzie zachowywał się w nieokreślony sposób, nie mogę uzyskać prawdziwej teoretycznej analizy tego, co się dzieje.
Cokolwiek robię, czy jest to uszkodzenie pamięci, czy nie?
Czy można cofnąć przydział wskaźnika NULL?
Nie znaleziono powiązanych wyników
Zaproszony:
Aby odpowiedzieć na pytania, Zaloguj się lub Zarejestruj się
10 odpowiedzi
Anonimowy użytkownik
Potwierdzenie od:
Opis
Funkcja powoduje zwolnienie miejsca wskazywanego przez , czyli gotowe
dostępne do dalszej dystrybucji. Jeśli jest pustym wskaźnikiem, nie jest podejmowana żadna akcja.
Widzieć
ISO-IEC 9899
http://www.open-std.org/JTC1/S ... 4.pdf
.
Jednak gdy spojrzysz na różne bazy kodów na wolności, zauważysz, że ludzie czasami robią to:
Dzieje się tak, ponieważ niektóre środowiska wykonawcze C (pamiętam dokładnie, co było w przypadku PalmOS) ulegają awarii po zwolnieniu wskaźnika .
Ale na razie myślę, że można bezpiecznie założyć, że nie jest zgodne z wytycznymi standardu.
Anonimowy użytkownik
Potwierdzenie od:
Jednak w pewnym momencie istniało kilka wersji darmowej wersji, która uległaby awarii (NULL), więc możesz zobaczyć kilka obronnych technik programowania.:
Anonimowy użytkownik
Potwierdzenie od:
mówi dokumentacja.
Anonimowy użytkownik
Potwierdzenie od:
Anonimowy użytkownik
Potwierdzenie od:
Możesz bezpiecznie usunąć wskaźnik NULL. W takim przypadku żadna operacja nie zostanie wykonana. Innymi słowy, free () nic nie robi ze wskaźnikiem NULL.
Anonimowy użytkownik
Potwierdzenie od:
Widzieć:
Kiedy ustawisz wskaźnik na po , możesz ponownie wywołać i żadna operacja nie zostanie wykonana.
Anonimowy użytkownik
Potwierdzenie od:
delete [] (void *) 0
są legalne w C ++.Swoją drogą, dwukrotne zwolnienie pamięci zwykle powoduje błąd w czasie wykonywania, więc niczego nie uszkadza.
Anonimowy użytkownik
Potwierdzenie od:
z szacunkiem
Anonimowy użytkownik
Potwierdzenie od:
Standardowo powinien to być kodeks prawny.
Anonimowy użytkownik
Potwierdzenie od:
Kiedy zwalniasz (ptr), zasadniczo pozwalasz menedżerowi pamięci na użycie 0x100 do innej czynności lub procesu, a mówiąc najprościej, jest to zwalnianie zasobów.
Kiedy robisz ptr = NULL, tworzysz punkt ptr w nowej lokalizacji (nie przejmujmy się tym, czym jest NULL). Robiąc to, straciłeś ślad danych pamięci 0x100. Na tym polega wyciek pamięci.
Dlatego nie zaleca się używania ptr = NULL na prawidłowym ptr.
Zamiast tego możesz przeprowadzić bezpieczne testy za pomocą:
if (ptr! = NULL)
{free(ptr);}
Kiedy zwalniasz (ptr), gdzie ptr już wskazuje na NULL, nie wykonuje operacji, więc jest bezpieczny.