#ocaml
#ocaml
Вопрос:
Мне любопытно, есть ли способ удалить и отменить выделение чего-либо в OCaml. Например, допустим, у меня есть массив, инициализированный с помощью:
let a = Array.make 10000 0;;
Как мне «удалить» a
?
Заранее благодарю.
Ответ №1:
Короткий ответ заключается в том, что значения удаляются (сборщиком мусора), когда к ним больше нельзя получить доступ.
Если это определение a
является глобальным определением, оно всегда доступно. Следовательно, он никогда не будет удален.
Если вместо этого это локальное определение в функции, оно будет удалено при возврате функции (или, возможно, раньше, если последняя ссылка находится перед завершением функции).
В общем, неизменяемые глобальные значения никогда не будут собираться мусором. Если вы хотите этого, вы можете использовать изменяемое глобальное значение:
let a = ref (Array.make 10000 0)
Когда вам больше не нужно a
, вы можете сделать это:
a := [| |]
Комментарии:
1. вы знаете, может ли массив быть собран после
a
привязки к другому значению?2. Вопрос в том, есть ли какие-либо ссылки на массив (значение), а не ссылки на
a
(контейнер, который может содержать значения). Итак, осторожный ответ: нет, любая дополнительная ссылка наa
не помешает сбору массива после того, как вы это сделаетеa := [||]
.