Они использовали общую фразу, такую как «очистить», потому что другие вещи, возможно, должны быть сделаны помимо просто восстановления памяти.Я могу видеть, как это может немного сбивать с толку, поскольку в цитате упоминается очистка ресурсов и восстановление памяти в одном предложении.В этом случае они имеют в виду, что сборщик мусора восстанавливает память, используемую управляемым кодом, который фактически вызывается в неуправляемую библиотеку (например, класс-оболочку), но оставляет процесс восстановления, специфичный для неуправляемого,, разработчику (закрытиедескрипторы файлов, освобождающие буферы и т. д.).
Например, у меня есть библиотека-оболочка Graphviz, содержащая класс Graph
.Этот класс объединяет функции, используемые для создания графов, добавления к ним узлов и т. Д. Внутренне этот класс поддерживает указатель на неуправляемую структуру графа, выделенную самим Graphiz.Для .NET Framework это просто IntPtr
, и он не знает, как освободить его во время сборки мусора.Таким образом, когда управляемый объект Graph
больше не используется, сборщик мусора освобождает память, используемую указателем, но не данные, на которые он указывает.Для этого мне нужно реализовать финализатор, который вызывает неуправляемую функцию agclose
(функция Graphviz, которая высвобождает ресурсы, используемые графом).