我想通过自己的方法销毁类实例。例如:
obj = Object()
obj:destroy()
type(obj) == nil
对象是在C上实现的。有可能吗?
如果不可能,第二种方式是:
_G["obj"] = nil
collectgarbage()
谢谢!
答案 0 :(得分:5)
我想通过自己的方法销毁类实例。
您应该不惜一切代价避免这种情况。如果你绝对需要,只在Lua中公开一个显式的析构函数例程。
处理此问题的正确方法是使您的Lua C对象成为an __gc
metamethod的元数据。在Lua垃圾收集对象之前,将调用此元方法。
如果你绝对必须使用一个显式的析构函数(因为你希望用户能够在完成后立即释放昂贵的资源,而不需要等待垃圾收集),那么你需要做两件事:
请勿 要求 用户明确销毁该对象。也就是说,该对象应该能够通过析构函数或通过垃圾收集来销毁。
明确销毁对象时,打破对象。如果用户调用显式销毁函数,则获取此对象的每个函数(成员函数或自由函数)仍然需要工作。这些功能可能无济于事,这很好。但该程序不应该崩溃。
基本上,当对象显然被销毁时,它仍然需要处于“活动”状态。你需要让对象成为一个僵尸:活着,但不是很有用。这样,即使它没有做正确的事情,你的程序仍然可以正常运行。
答案 1 :(得分:3)
示例中的简单obj = nil
就足够了。请注意,您不销毁对象的内容,删除变量obj
中的引用,使得内存中某处的实际对象少一个引用,如果它达到0引用,没有资格参加GC。
如果您的对象在销毁时没有执行某些外部任务,那几乎就是您所需要的。只是丢失所有引用,让它们超出范围或覆盖包含其他内容或nil
引用的变量/表成员。否则,您需要先调用特定于对象的析构函数,然后才删除引用。
不可能使这样的析构函数自动从所有地方删除所有引用,但至少它可以清除对象的内部状态并设置一些内部标志,该对象不再可用或准备重新初始化。
答案 2 :(得分:1)
在某种程度上是可能的。您可以在对象中创建子表作为私有数据存储。该子表仅由对象管理,因此只能有一个引用。如果为对象定义析构函数方法,则会删除相应的子表,使其符合垃圾回收的条件。当然,父表仍然存在,只留下不占用任何重要资源的方法。
这是否是"良好的设计"是主观的。我只是提出问题的解决方案。