【问题标题】:Getting rid of an instance of a class in Lua在 Lua 中摆脱一个类的实例
【发布时间】:2019-05-23 18:37:10
【问题描述】:

我目前正在尝试在 Lua 中进行 OOP。据我了解here,类的 instance 甚至 class (变量)本身都是对类所拥有的各种位和鲍勃的引用,所以如果我有一个方法:destroy(),由

组成
function class:destroy()
  self = nil
end

当我调用instance:destroy() 时,引用instance 应该由垃圾收集器 拾取,实际上,实例就像在一个对象中没了。

它不会抛出错误或慢慢导致内存泄漏,对吧?

编辑:我想也许我也应该包括以下内容。

这是我用来创建和实例化的方法

function class:new(obj)
  obj = obj or {}
  setmetatable(o,self)
  self.__index = self
  return o
end

【问题讨论】:

    标签: oop lua lua-table metatable


    【解决方案1】:

    通常,您不必做任何事情来摆脱实例或任何其他类型的表。垃圾收集器会自动释放没有被任何东西引用的任何表的内存。如果您确实需要在表超出范围之前释放一些内存,只需将 nil 分配给它的变量,垃圾收集器将完成剩下的工作。

    您的destroy 方法没有任何效果,因为self 只是一个参数(它是一个局部变量)。直接分配给它不会影响调用者可以看到的任何内容。

    【讨论】:

    • 所以与其写花哨的:destroy(),不如直接做instance = nil ?
    • 是的,但除非您知道自己内存不足,否则即使这样也没有必要。
    • @Bogdan705:即使将实例变量设置为nil 也无法保证。其他人可能会引用该对象,因此该对象将继续存在。这并不是说您不应该删除对本地代码不再需要的对象的引用,但除非您确定没有其他人任何地方对它有引用,否则您不应假定不存在此类引用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-15
    • 1970-01-01
    • 2019-09-29
    • 2017-07-06
    • 2014-05-15
    相关资源
    最近更新 更多