<p>据报道,这是在3.4中修复的<a href="http://bugs.python.org/issue1545463" rel="nofollow">http://bugs.python.org/issue1545463</a>中的一个错误,但没有后端口(我运行的是2.7)。这在<a href="http://code.activestate.com/lists/python-list/504216/" rel="nofollow">http://code.activestate.com/lists/python-list/504216/</a>中也有解释。Python3.5的输出见下文。在</p>
<p>基于以上,我的理解是,在2.7中,当解释器退出时,新样式类<code>WithMembers</code>仍然存在(没有被GC清理)。因此,<code>classMem</code>没有被垃圾回收,因为<code>WithMembers</code>仍然引用它。在</p>
<p>请注意,新的样式类具有来自<code>__mro__</code>和一些内置描述符(<a href="http://bugs.python.org/issue17950" rel="nofollow">http://bugs.python.org/issue17950</a>)的循环引用。即使模块级的新样式类在模块清理之后被GC认为是死的,但是在模块清理之后清理它们的GC调用被禁用,因为这会导致太多其他问题。在</p>
<p>这不会导致内存泄漏,因为在解释器退出后,操作系统会清理资源。在</p>
<pre><code>class Member(object):
def __init__(self, identifier):
self.identifier = identifier
print("Member __init__ " + self.identifier)
def __del__(self):
print("Member __del__ " + self.identifier)
with open("/home/might/" + self.identifier, "w") as outF:
outF.write(self.identifier)
class WithMembers(object):
def __init__(self):
print("WithMembers __init__")
print(WithMembers.classMem)
self.instanceMem = Member("instance mem")
def __del__(self):
print("WithMembers __del__")
classMem = Member("class mem")
if __name__ == "__main__":
print("main")
WithMembers()
print("end")
</code></pre>
<p>使用<code>python3 Hidden.py</code>运行时输出以下内容:</p>
^{pr2}$