破坏常见Lisp中的结构或类

时间:2018-09-17 19:14:43

标签: data-structures garbage-collection lisp common-lisp

我想知道在Common Lisp中销毁通过defstruct创建的结构的选项是什么。似乎自动提供了一个构造函数。但是,析构函数并非如此。

可以从内存中“清除”结构的方法有哪些?我想到(setq my-struct NIL)之类的东西,但是我不确定这是否是最干净的方法吗?

修改:

当我尝试测试如果我使用结构作为键将某个东西键入哈希表,然后销毁该结构时会发生什么问题。哈希表中的键会发生什么?我想这更多是关于如何实现哈希表的问题。

2 个答案:

答案 0 :(得分:4)

由于Common Lisp是一种动态语言,因此垃圾收集器将在不再使用(在任何地方引用)时从内存中删除结构。因此,是的,当您为结构分配名称(即my-struct)然后为该名称分配nil时,结构将从内存中删除。

当您同时将此结构用作键时,它还有一个参考,因此即使将nil分配给my-struct,结构也将保留在内存中,直到您将其从哈希中删除为止桌子。

值得注意的是,make-hash-table还带有可选的test参数:

  

test ---函数eq,eql,equal或   等值默认值为eql。   http://www.lispworks.com/documentation/HyperSpec/Body/f_mk_has.htm

将结构用作键时,应将test设置为equalp

答案 1 :(得分:4)

用户无法从内存中“清除”对象。要释放内存并“清除”,这是垃圾收集器的目的。

一个人也许可以使用 finalizers 的非标准机制,该机制允许人们在垃圾收集器即将破坏对象时安排操作。

在类似Trivial Garbage的地方看到“完成”