Chodzi przede wszystkim o artefakt historyczny, a nie niemożność wdrożenia.
Większość kompilatorów C buduje kod w taki sposób, że kompilator widzi tylko każdy plik źródłowy na raz; nigdy nie widzi całego programu naraz. Kiedy jeden plik źródłowy wywołuje funkcję z innego pliku źródłowego lub biblioteki, wszystko, co kompilator widzi, to plik nagłówkowy z typem zwracanym przez funkcję, a nie faktyczny kod funkcji. Oznacza to, że gdy istnieje funkcja zwracająca wskaźnik, kompilator nie ma sposobu, aby stwierdzić, czy pamięć, na którą wskazuje wskaźnik, musi zostać zwolniona, czy nie. Informacje do podjęcia decyzji, które nie są pokazywane kompilatorowi w tym momencie. Z drugiej strony, ludzki programista może wyszukiwać kod źródłowy funkcji lub dokumentację, aby dowiedzieć się, co należy zrobić ze wskaźnikiem.
Jeśli spojrzysz na bardziej nowoczesne języki niskiego poziomu, takie jak C ++ 11 lub Rust, przekonasz się, że większość z nich rozwiązała problem, ujawniając własność pamięci w typie wskaźnika. W C ++ użyłbyś unique_ptr<T>
zamiast zwykłego T*
do przechowywania pamięci i unique_ptr<T>
upewnia się, że pamięć zostanie zwolniona, gdy obiekt osiągnie koniec zakresu, w przeciwieństwie do zwykłego T*
. Programiści mogą przekazywać pamięć między unique_ptr<T>
sobą, ale tylko jedna może unique_ptr<T>
wskazywać na pamięć. Dlatego zawsze jest jasne, kto jest właścicielem pamięci i kiedy należy ją uwolnić.
C ++, ze względu na kompatybilność wsteczną, nadal umożliwia ręczne zarządzanie pamięcią starego stylu, a tym samym tworzenie błędów lub sposobów obejścia ochrony unique_ptr<T>
. Rdza jest jeszcze bardziej surowa, ponieważ wymusza reguły własności pamięci poprzez błędy kompilatora.
Jeśli chodzi o nierozstrzygalność, problem zatrzymania i tym podobne, tak, jeśli trzymasz się semantyki C, nie jest możliwe określenie dla wszystkich programów, kiedy pamięć powinna zostać zwolniona. Jednak w przypadku większości rzeczywistych programów, a nie ćwiczeń akademickich lub błędnego oprogramowania, absolutnie można zdecydować, kiedy uwolnić, a kiedy nie. To przecież jedyny powód, dla którego człowiek może w pierwszej chwili dowiedzieć się, kiedy się uwolnić.