Уничтожение структуры или класса в Common Lisp - PullRequest
0 голосов
/ 17 сентября 2018

Мне интересно, каковы варианты уничтожения структуры, созданной с помощью defstruct в Common Lisp. Похоже, что конструктор предоставляется автоматически; однако, это не относится к деструктору.

Каким образом можно «очистить» структуру от памяти? На ум приходят такие вещи, как (setq my-struct NIL), но я не уверен, что это самый чистый способ сделать это?

Редактировать:

Вопрос возник, когда я пытался проверить, что произойдет, если я что-то ввел в хеш-таблицу, используя структуру в качестве ключа, а затем уничтожил эту структуру. Что будет с ключом в хеш-таблице? Я думаю, это больше вопрос о том, как реализованы хеш-таблицы.

Ответы [ 2 ]

0 голосов
/ 18 сентября 2018

Пользователь не может «очистить» объект от памяти.Освободить память и «очистить» ее цель - сборщик мусора.

Можно использовать нестандартный механизм финализаторы , который позволяет планировать действия, когдасборщик мусора собирается уничтожить объект.

См. 'финализировать' что-то вроде Trivial Garbage

0 голосов
/ 18 сентября 2018

Поскольку Common Lisp является динамическим языком, сборщик мусора удалит структуру из памяти, когда она больше не используется (где-либо упоминается). Так что да, когда вы присваиваете имя структуре (т.е. my-struct), а затем присваиваете nil этому имени, структура будет удалена из памяти.

Когда вы используете эту структуру также в качестве ключа, у нее есть еще одна ссылка, поэтому даже когда вы присваиваете nil значение my-struct, структура будет оставаться в памяти, пока вы не удалите ее из хеш-таблицы.

Стоит отметить, что make-hash-table принимает также необязательный аргумент test:

test --- обозначение для одной из функций eq, eql, равна или EQUALP. По умолчанию используется eql. http://www.lispworks.com/documentation/HyperSpec/Body/f_mk_has.htm

Когда вы используете структуры в качестве ключей, вы должны установить test на equalp.

...