Pythonでの循環参照によるメモリリーク


Pythonでのメモリリーク、Pythonでのメモリリークを発生させる技術.
――メモリの漏洩に伴う日々へ
事実は、プログラムを書くのはとても面白いことだと証明しています.
Pythonの拡張モジュール(ツールを使用しない)を自分の勤勉な両手でカプセル化しようとしたことがありますが、私のIQでは強い引用カウントや弱い引用カウントをうまく管理できないかもしれないことに賢明に気づきました......そこで私は動揺しました.
動揺の結果、私はSWIGを使ってこのことを始めました.
私の心の中の1つの音は風雨の交じる夜空の中で大声で叫んでいます:さようなら、どのように削除しても削除できないメモリ;削除せずに自動的に消えてしまう意外なメモリもありますが...
さあ、もう一度あの「自動ごみ収集時代」の有名なジョークに戻りましょう......
>>> class LeakTest(object):
def __init__(self):
print 'Object with id %d born here.' % id(self)
def __del__(self):
print 'Object with id %d dead here.' % id(self)

>>> T1 = LeakTest()
Object with id 10462352 born here.
>>> T2 = T1
>>> T1 = None
>>> T2 = None
Object with id 10462352 dead here.

いいですね.これが私たちがPythonに逃げた理由です.ゴミはいつも自動的に消えてしまいます.そして・・・
>>> A = LeakTest()
Object with id 10462512 born here.
>>> B = LeakTest()
Object with id 10462544 born here.
>>> A.b = B
>>> B.a = A
>>> A = None
>>> B = None

つまり、ポインタで
A、
B恋をしていたとき、元のメモリは消えなかった.理由は「
A=None」の場合、
A.bはまだ指している
B、だから
Aが指すオブジェクトはまだ削除できません.同じ理屈だから
Aの指す対象がまだあるので、「
B.a=A」のため、対象
Bも削除できません.
このとき
Aと
Bは既に
None、メモリ漏れが発生しました.
考えてみれば、Pythonメモリの漏洩はC/C++よりも速いようですね(self.xxx=selfは書かないでください).
最後に役割ドメイン付きのものを書き終わり、みんなを笑わせる.
>>> def foo():
A = LeakTest()
B = LeakTest()
A.b = B
B.a = A

>>> foo()
Object with id 10462448 born here.
Object with id 10462832 born here.