Wpis z mikrobloga

Jak w językach z garbage collectorem załatwia się operacje typu: zamknięcie socketa, zamknięcie pliku? Programista sam musi pilnować, żeby funkcja "close()" się wykonała i jak wpadnie jakiś wyjątek nieobsłużony to socket pozostaje otwarty?
#programowanie
  • 8
@Gerax9: normalnie, wywołujesz .close() ręcznie. Ew. np. w Pythonie używasz context managera

with open(filename, 'r') as f:
    data = f.read()
# Po wyjściu z bloku with następuje zamknięcie pliku
@zwei: z tego, co wiem, to takie rozwiązanie też jest w C# np. tylko, że tam to się nazywa using
using (var something = new ClassThatImplementsIDisposable())
{
    // stuff happens here
}
@Gerax9: popularne języki z GC nie posiadają żadnego mechanizmu o takiej sile jak RAII i niestety musisz się pogodzić z brakiem ergonomii, niższą produktywnością i większym ryzykiem błędów w zarządzaniu zasobami. Wszystkie te rzeczy takie jak try with resources, defer, managery kontekstu, finally itp to jedynie nędzna namiastka, takie nieco ładniejsze goto cleanup z C. Minimalnie ładniejsza składnia ale semantycznie taka sama kicha jak goto
@Gerax9: finally nie jest wywoływane przez GC - jest deterministycznie wywoływane przy opuszczeniu bloku, ale nie jest też równoważne RAII - po pierwsze podstawowa wada jest taka że o finally trzeba pamiętać, po drugie musisz wprowadzić dodatkowa zmienna przed try i potem w finally sprawdzać czy nie jest nullem, a po trzecie jest to ściśle związane z zasięgiem leksykalnym. Nie możesz w ten sposób zarządzać zasobami które są np. w polu