Data structures 在公共Lisp中销毁结构或类

Data structures 在公共Lisp中销毁结构或类,data-structures,garbage-collection,lisp,common-lisp,Data Structures,Garbage Collection,Lisp,Common Lisp,我想知道在Common Lisp中销毁通过defstruct创建的结构的选项是什么。似乎自动提供了构造函数;然而,对于析构函数来说,情况并非如此 从记忆中“清除”结构的方法有哪些?像(setq my struct NIL)这样的事情会浮现在脑海中,但我不确定这是否是最干净的方法 编辑: 当我试图测试如果我使用一个结构作为键将某个内容键入哈希表,然后销毁该结构,会发生什么情况时,问题就出现了。哈希表中的键会发生什么变化?我想这更多的是关于如何实现哈希表的问题 因为Common Lisp是一种动态语

我想知道在Common Lisp中销毁通过
defstruct
创建的结构的选项是什么。似乎自动提供了构造函数;然而,对于析构函数来说,情况并非如此

从记忆中“清除”结构的方法有哪些?像
(setq my struct NIL)
这样的事情会浮现在脑海中,但我不确定这是否是最干净的方法

编辑:


当我试图测试如果我使用一个结构作为键将某个内容键入哈希表,然后销毁该结构,会发生什么情况时,问题就出现了。哈希表中的键会发生什么变化?我想这更多的是关于如何实现哈希表的问题

因为Common Lisp是一种动态语言,所以当结构不再使用时(在任何地方引用),垃圾收集器将从内存中删除该结构。因此,是的,当您为一个结构(即
mystruct
)指定一个名称,然后将nil指定给该名称时,该结构将从内存中删除

当您将此结构用作键时,它还有一个引用,因此即使将nil赋值给
my struct
,该结构仍将保留在内存中,直到您将其从哈希表中删除

值得注意的是,
make hash table
也可以选择
test
参数:

测试——eq、eql、equal或equalp函数之一的指示符。默认值是eql。


当您使用结构作为键时,应该将
test
设置为
equalp

,因为Common Lisp是一种动态语言,所以当不再使用结构时(在任何地方引用),垃圾收集器将从内存中删除该结构。因此,是的,当您为一个结构(即
mystruct
)指定一个名称,然后将nil指定给该名称时,该结构将从内存中删除

当您将此结构用作键时,它还有一个引用,因此即使将nil赋值给
my struct
,该结构仍将保留在内存中,直到您将其从哈希表中删除

值得注意的是,
make hash table
也可以选择
test
参数:

测试——eq、eql、equal或equalp函数之一的指示符。默认值是eql。


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

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

您可以使用非标准的终结器机制,它允许您在垃圾收集器即将销毁对象时安排操作


请参见类似于

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

您可以使用非标准的终结器机制,它允许您在垃圾收集器即将销毁对象时安排操作


请参见类似于

的“最终确定”部分,您为什么在意?当您不再使用GC时,它将为您执行此操作。请确保您使用局部变量而不是全局变量来保存临时对象。垃圾收集将在变量作用域结束时回收内存。这类似于JavaScript、PHP、Python和Ruby。您不必像在C或C++中那样手动地管理内存。我理解所有这些。当我试图测试如果我使用一个结构作为键将某个内容键入哈希表,然后销毁该结构,会发生什么情况时,问题就出现了。哈希表中的键会发生什么变化?我想这更多的是一个关于哈希表是如何实现的问题。@madbysicator你能把这个评论作为你问题的一部分吗?你为什么在意?当您不再使用GC时,它将为您执行此操作。请确保您使用局部变量而不是全局变量来保存临时对象。垃圾收集将在变量作用域结束时回收内存。这类似于JavaScript、PHP、Python和Ruby。您不必像在C或C++中那样手动地管理内存。我理解所有这些。当我试图测试如果我使用一个结构作为键将某个内容键入哈希表,然后销毁该结构,会发生什么情况时,问题就出现了。哈希表中的键会发生什么变化?我想这更多的是一个关于哈希表是如何实现的问题。@madbysicator你能在你的问题中添加这个注释吗?
当你使用结构作为键时,你应该将test设置为equalp
,除非你想通过eq进行比较(当然有有效的例子),或者直到哈希表不再可访问为止。大多数lisp实现将能够清除无法访问的数据,但仍然(由于循环引用,被引用)数据。有些人不会。准确的行为被视为实现的质量。
当您使用结构作为键时,您应该将test设置为equalp
,除非您希望通过eq进行比较(当然有有效的案例),或者直到哈希表不再可访问为止。大多数lisp实现将能够清除无法访问的数据,但仍然(由于循环引用,被引用)数据。有些人不会。准确的行为被视为实现的质量。