【发布时间】:2012-09-14 22:21:24
【问题描述】:
我正在为 C++ 程序的 swig 接口构建一个 Python 包装器。
我很想知道 Python 对象是否有办法“知道”它是如何被删除的。这个想法很简单,如果垃圾收集器删除了对象,则包装器不会对底层 C++ 对象做任何事情,但如果用户故意删除了对象(``del 对象),那么包装器会检测到该对象并取消引用底层对象,以便它也被删除。
我已经尝试过用谷歌搜索,但找不到任何东西。我发现的唯一一件事是(显然)__del__ 被垃圾收集器和 del 命令调用,似乎无法区分是哪个调用它。
希望有人证明我错了!
【问题讨论】:
-
这里的问题是
del只删除了一个引用,它并不能保证对象被删除——所以实际上所有的删除都是由垃圾收集器完成的。 -
你错了。正如 Lattyware 所提到的,
del只删除了一个引用,该对象可能从此过上幸福的生活,或者可能变得无法访问。在任何情况下,只有自动内存管理调用__del__,但不能保证。事实上,在很多情况下定义__del__防止 清理(即它不被调用)。请参阅documentation。 -
@delnan:有趣的是,PyPy 通过随机选择一个要删除的对象来破坏循环引用,
__del__钩子与否。 -
@MartijnPieters 是的,这表明实现定义这些东西是多么疯狂。你真的不能依赖任何东西。例如,如果
__del__恢复(例如存储在全局中)对象,CPython 将重复调用__del__,但 PyPy 只会调用一次。如果类没有定义__del__方法,PyPy 也不会尊重附加到单个对象的__del__。不要问我为什么我知道这些晦涩的东西o.O -
我非常同意;我仅以 PyPy 为例指出 GC 行为是依赖于实现的。
标签: c++ python oop wrapper swig