smart_ptr подсчитаны. Хотя это позволяет детерминистически высвобождать свои ресурсы, когда на них больше нет ссылок из какого-либо кода, у них действительно есть свои собственные проблемы: назначение ссылок всегда требует обновления счетчика, циклические ссылки не удаляются автоматически, вызывая утечки памяти, диспетчер памяти вызывается чаще.
ГХ в .NET - это быстрый сборщик. Он запускается в любое время, когда он чувствует, что память должна быть освобождена (как правило, вызвано некоторыми условиями использования памяти, но не детерминированно), и начинается с создания списка всех активных ссылок в системе (включая ссылки в регистрах ЦП, вложенные ссылки и т. Д. .). Это работает, поскольку мы находимся в управляемой среде, где вы не можете выполнять арифметику указателей и т. Д. - система может отслеживать все ссылки. После того, как список живых ссылок был создан, он в основном освобождает всю память, которая больше не используется. Конечно, это всего лишь базовый набросок, для эффективности и управления неуправляемыми ресурсами есть нечто большее, например, генерация объектов, финализаторы и т. Д., Но это не важно для базового понимания того, как это работает.
Интерфейс IDisposable используется для реализации одноразового шаблона, который помогает, когда вы работаете с объектами, которые должны быть расположены детерминированным способом. Шаблон таков, что Dispose () вызывается явно, когда объект больше не нужен, поэтому освобождает неуправляемые ресурсы или закрывает дескрипторы и т. Д., Но не освобождает свою память. Это будет сделано GC позже, но не имеет значения, что это произойдет позже, потому что детерминированное освобождение ресурсов уже выполнено.