我在用PyGtk。
当小部件被销毁时,连接到小部件的信号“runtime-generated”的garbage-collected函数会是吗?
关于创建并与拖动源/dest目标关联的Gtk.TargetList的相同问题?
我确实找到了Python and GTK+: How to create garbage collector friendly objects?,但没有太大帮助。
发布于 2014-11-03 17:12:03
简单地说,是的,动态创建的函数就像运行时创建的任何其他Python对象一样。
更长的答案:对于垃圾收集器管理的资源,例如没有绑定到外部资源的对象,Python和PyGTK将正确地释放未使用的对象。对于外部资源(如打开的文件或正在运行的线程),您需要采取步骤确保它们的正确清理。要准确地回答你的问题,看看具体的代码是有用的。一般来说,以下内容适用于Python和GTK:
您可以使用来自weakref模块的弱引用类型来测试这一点。例如:
>>> import gtk
>>>
>>> def report_death(obj):
... # arrange for the death of OBJ to be announced
... def announce(wr):
... print 'gone'
... import weakref
... report_death.wr = weakref.ref(obj, announce)
...
>>> def make_dynamic_handler():
... def handler():
... pass
... # for debugging - we want to know when the handler is freed
... report_death(handler)
... return handler
...
>>> w = gtk.Window()
>>> w.connect('realize', make_dynamic_handler())
10L
>>> w.destroy()
gone现在,如果您将代码更改为handler以包含循环引用,例如修改它以提及自身:
def handler():
handler # closure with circular reference...the调用销毁将不再导致gone立即打印-这将要求程序继续工作,或一个明确的调用gc.collect()。在大多数Python程序中,自动去分配“只起作用”,您不需要做任何努力来帮助它。
最终,唯一可靠的测试(是否存在内存泄漏)是在无限循环中运行可疑代码,并监视进程的内存消耗--如果它无限制地增长,一些东西不会被释放,您就会出现内存泄漏。
https://stackoverflow.com/questions/26683870
复制相似问题