【问题标题】:Destroying a Structure or Class in Common Lisp销毁 Common Lisp 中的结构或类
【发布时间】:2018-09-17 19:14:43
【问题描述】:

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

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

编辑:

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

【问题讨论】:

  • 你为什么在乎?当你不再使用它时,GC 会为你做。
  • 确保使用局部变量而不是全局变量来保存临时对象。当变量的作用域结束时,垃圾回收会回收内存。
  • 这类似于 JavaScript、PHP、Python 和 Ruby。您不必像在 C 或 C++ 中那样手动管理内存。
  • 我明白这一切。当我试图测试如果我使用结构作为键将某些内容键入哈希表然后破坏该结构时会发生什么,问题就出现了。哈希表中的键会发生什么?我想这更多是关于如何实现哈希表的问题。
  • @MadPhysicist 您能否将此评论添加为您的问题的一部分?

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


【解决方案1】:

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

当你使用这个结构 also 作为键时,它多了一个引用,所以即使你将 nil 分配给my-struct,结构也会保留在内存中,直到你从哈希表中删除它.

值得注意的是,make-hash-table 也接受可选的test 参数:

test---函数 eq、eql、equal 或 equalp 之一的指示符。默认值为 eql。 http://www.lispworks.com/documentation/HyperSpec/Body/f_mk_has.htm

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

【讨论】:

  • When you use structures as keys, you should set test to equalp 除非您当然想通过 eq 进行比较(有有效案例)
  • 或者直到哈希表不再可访问。大多数 lisp 实现将能够清除无法访问但仍然(由于循环引用、引用)的数据。有些不会。确切的行为被视为实现质量。
【解决方案2】:

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

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

请参阅Trivial Garbage 之类的“最终确定”

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-02-21
    • 2012-10-07
    • 2021-11-15
    • 1970-01-01
    • 1970-01-01
    • 2020-02-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多