Здравствуйте, vsb, Вы писали:
vsb>>>Reference counting будет работать, но нужно не забывать руками рвать циклы. С GC это всё, конечно, намного проще.
V>>Это несильно отличается от явного вызова Dispose() в том же дотнете.
vsb>Что такое Dispose? Я так понимаю, аналог close в Java для закрытия ресурсов вроде файлов?
Что-то типа, но только оно максимально распространено в дизайне.
Более того, в C# введены ср-ва RAII (через ключевое слово using), которые доказали свою мега-удобность еще в плюсах.
Т.е., язык C# "знает в лицо" конкретный интерфейс IDisposable() или даже просто метод Dispose() у ref-структур, которые не могут реализовывать интерфейсы.
vsb>Тогда — это сильно отличается. Потому, что динамическая память — она везде, она в каждой функции практически. Во многих местах неявно, создали замыкание, оно забрало переменные в кучу. И очень часто происходит ситуация, когда создаётся объект в одном месте, а становится доступен для удаления — в другом (причём зачастую это вообще статически не определяется).
И в чём печаль? ))
Разумеется, задачи бывают разные — иногда жизненный цикл объектов отследить просто (через граф владения), а иногда сложно (расшаренное владение, в т.ч. по потокам исполнения).
Не зря же, что в Джаве, что в Шарпе в некоторых задачах не стесняются использовать подсчёт ссылок.
Да и сам грешен на Шарпе этим порой. ))
И вот как раз через паттерн Dispose() удобно обыгрывается подсчёт ссылок, когда задача это диктует.
vsb>С файлами и подобными ресурсами всё по-другому. Они действительно практически всегда открывается и закрываются в одном методе. И для них этот паттерн прекрасно работает.
Ресурсом может быть не только файл.
Сейчас всё такое сетецентрическое...