简短问题:
信号处理程序会造成内存泄漏吗?
长问题:
在C#中,如果我将处理程序附加到事件上,那么当事件触发时,处理程序的代码将执行。如果该处理程序分配了内存但未释放,是否会导致内存泄漏?如果是,有什么方法可以避免这种情况发生?
left_object.left_event += right_object.right_handler
当我摆脱 right_object
时,我需要删除处理程序,否则垃圾收集器将永远不会处理它(因为 left_object.left_event
保留了对 right_object
的指针)。
PyQt 信号和槽也是这样吗?
left_object.left_signal.connect( right_object.right_handler )
我从this问题中了解到,当
left_object
或right_object
的析构函数被调用时,Qt会自动取消信号和槽之间的链接,但在Python中,我无法显式调用析构函数,并且right_handler
是一个普通的函数。我需要删除处理程序以防止
right_object
内存泄漏,还是PyQt使用某种弱引用技术?虽然其中一个答案涉及此问题,this similar question提出了有关PyQt如何处理lambda表达式中的对象而不是如何处理信号的问题。