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?
Zaproszony:
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

7.20.3.2 Funkcja
free
Streszczenie
#include <stdlib.h> 
void free(void *ptr);

Opis
Funkcja
free
powoduje zwolnienie miejsca wskazywanego przez
ptr
, czyli gotowe
dostępne do dalszej dystrybucji. Jeśli
ptr
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:
if (ptr)
free(ptr);

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
NULL
.
Ale na razie myślę, że można bezpiecznie założyć, że
free (NULL)
nie jest zgodne z wytycznymi standardu.
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Wszystkie zgodne ze standardami wersje biblioteki C traktują darmową (NULL) jako zakaz działania.
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.:
if (ptr != NULL)
free(ptr);
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Jeśli ptr ma wartość NULL, operacja nie jest wykonywana.

mówi dokumentacja.
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Pamiętam, jak pracowałem na PalmOS, gdzie zawieszał się
free (NULL)
.
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

free(ptr);
ptr=NULL;
free(ptr);/*This is perfectly safe */

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

Anonimowy użytkownik

Potwierdzenie od:

Zalecane użycie:
free(ptr);
ptr = NULL;

Widzieć:
man free The free() function deallocates the memory allocation pointed to by ptr.
If ptr is a NULL pointer, no operation is performed.

Kiedy ustawisz wskaźnik na
NULL
po
free ()
, możesz ponownie wywołać
free ()
i żadna operacja nie zostanie wykonana.
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

free (NULL)
jest całkowicie legalny w C, podobnie jak
delete (void *) 0
i
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

Anonimowy użytkownik

Potwierdzenie od:

free (ptr) jest przechowywany w C, jeśli ptr ma wartość NULL, jednak większość ludzi nie wie, że NULL nie musi być 0. Mam dobry przykład starej szkoły: na C64 pod adresem 0 jest port IO . Gdybyś miał napisać program w C, aby uzyskać dostęp do tego portu, potrzebowałbyś wskaźnika o wartości 0. Wtedy odpowiadająca mu biblioteka c musiałaby rozróżniać między 0 a NULL.
z szacunkiem
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

nie uszkodzenie pamięci, ale zachowanie zależy od implementacji.
Standardowo powinien to być kodeks prawny.
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

ptr wskazuje na jakiś obszar pamięci, powiedzmy 0x100.
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.

Aby odpowiedzieć na pytania, Zaloguj się lub Zarejestruj się