2017-09-21 4 views
0

のは、私は2つのクラスがあるとしましょう:私は、そのオブジェクトへのポインタとして別のオブジェクトにオブジェクトを置くとき、私は、する必要が削除する必要があり、C++でPythonのネストされたオブジェクトのデストラクタ

import matplotlib.pyplot as plt 

class AClass: 
    def __init__(self): 
     self.A = SomeStuff() 
     self.B = plt.figure(1) 
    def SomeOtherThings(self): 
     MaybeIPlotSomeThingsToThatPlotEtc 
     .... 

class AnotherClass: 
    def __init__(self): 
     self.AClassWithinAClass = AClass() 
     self.B = plt.figure(2) 
    def SomeOtherThings(self): 
     MaybeIPlotSomeThingsToThatPlotEtc 
     .... 

をそれはデストラクタで、またはメモリリークです。

質問1:上記の擬似コードでは、self.Bはデストラクタで削除する必要があるポインタの種類ですか?

質問2:変数AClassWithinAClassはどうなりますか?それはデストラクターで削除する必要があるポインタですか、あるいはAnotherClassが削除されたときにPythonがそれを取り除くことを知っていますか?

私はポインタやものについて(Pointers in Python?)グーグルで試してみましたが、Pythonはそのような暗黙の言語なので、私は緊張していると思います。

+0

号は、Pythonにはポインタはありません、そしてメモリはあなたのために管理されています。 –

+0

デストラクタによってあなたが '__del__'を参照しているのであれば**はそれを実装していません**それを乱用するとメモリリークが発生する可能性があるからです。 –

答えて

0

これらの両方の場合、デストラクタメソッドを明示的に呼び出す必要はありません。 Pythonはガベージコレクションを使用してメモリを管理します。これを維持するため、参照カウントを使用します。 Pythonは、特定のオブジェクトを参照する変数の数をカウントします。しかし、Pythonが何かによって参照されない変数を持っていれば、メモリを解放します。私は確かにPythonの内部メモリ管理の専門家ではありませんが、それは私の理解です。

Previous StackOverflow Post

関連する問題