Отменить выделение большого массива

#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 := [||] .