Mam już pewne doświadczenie z C++ i C#, w obu językach można programować obiektowo i jedną z zasadniczych różnic jest to, że w C++ obiekty tworzy się i niszczy ręcznie, w sposób kontrolowany, a w C# nie ma możliwości kontroli niszczenia obiektów, jedynie można zgubić obiekt, (celowo spowodować wyciek pamięci), a obiekt zostanie zniszczony nie wiadomo kiedy.
Te dwa podejścia mają zalety i wady. Może wiecie, dlaczego ani Microsoft (twórca C#), ani Oracle (twórca Java), ani twórcy C++ nie mogą lub nie chcą połączyć tych dwóch podejść? A może już coś takiego istnieje, tylko ja o tym nie wiem?
Chodzi o to, że obiekt może być zarówno ręcznie, jak i przez automat (GC). Dla Microsoftu i Oracle to tylko dodać polecenie typu "delete", które uruchamia destruktor obiektu i niszczy go, dokładnie tak samo, jak GC w przypadku trafienia na nieosiągalny obiekt. Wtedy GC usuwałby skutki wycieków pamięci. Spotkałem się z sytuacjami, że program w C# zajmuje coraz więcej pamięci właśnie przez częste tworzenie obiektów, a wystarczyłoby, żeby w miejscu, w którym wiadomo, że obiekt nie jest już potrzebny, wywołać jego zniszczenie, a nie zdawać się na działanie GC. Już tyle wersji .NET i JVM było, a tego "drobiazgu" ani Microsoft, ani Oracle nie kwapi się dorobić. Może są jakieś przeszkody techniczne? Pomijam fakt, że taki "puchnący" program to często źle przemyślany program.
A jeżeli już musi być GC, to dlaczego nie może być jednocześnie zliczanie referencji i Mark&Sweep? Wtedy w takim C# obiekt znikałby zaraz po zgubieniu referencji do niego, a M&S przyda się do przypadków obiektów z referencjami cyklicznymi, których nie usunie metoda zliczania referencji.
Rozumiem, że Microsoft uznał, że programiści C++ zapominają o niszczeniu obiektów i wymyslił C# z Garbage Collector odporny na takie błędy. Tylko nie rozumiem, dlaczego nie mógł wyposażyć w ręczne usuwanie obiektów tak samo, jak w C++?