Как удалить/освободить/завершить неуправляемые ресурсы, когда общее значение выходит за рамки

У меня есть тип, который инкапсулирует ключ к внешнему ресурсу. Как только ключ потерян (все значения, которые его разделяют, выходят за пределы области действия), ресурс должен быть освобожден (неявно) при следующей сборке мусора, как это делает память для обычных значений.

Поэтому я ищу что-то похожее на удаление ООП или ForeignPtr, только то, что я представляю ссылки на что-то кроме объектов из иностранных языков (хотя если ForeignPtr может правильно и элегантно работать и для этого, зная, как бы тоже ответить на этот вопрос).

Является ли это возможным? если да, то как?


person MasterMastic    schedule 13.11.2014    source источник


Ответы (2)


Вы можете использовать System.Mem.Weak.addFinalizer для этого.

К сожалению, поначалу семантика слабых ссылок может быть немного трудной для понимания. Предостережение особенно важно.

Если вы можете прикрепить IORef, MVar или TVar к вашему ключу и сделайте слабую ссылку/ финализатор, связанный с этим, вероятно, будет намного надежнее.

В особом случае, когда ваш ключ является указателем на неуправляемую память (например, некоторую структуру данных C), вы должны вместо этого создать ForeignPtr и прикрепите к нему финализатор. Семантика этих финализаторов немного отличается; а не произвольное действие ввода-вывода, финализатор должен быть указателем на внешнюю функцию.

person John L    schedule 14.11.2014

Я предлагаю вам просмотреть ResourceT:

ResourceT — это монадный преобразователь, который создает область кода, в которой вы можете безопасно распределять ресурсы.

person sinelaw    schedule 13.11.2014