2010-12-29 6 views
9

PythonのCTypesを使用する場合は、Python側でc-structureを複製できる構造体と、メモリアドレス値からソフォスティックなPythonオブジェクトを作成するPOINTERSオブジェクトがあり、参照によってオブジェクトを渡すために使用できます。前のCコード。Pythonオブジェクトが削除されると、Ctypes StructuresとPOINTERSは自動的にメモリを解放しますか?

ドキュメンテーションや他の場所では見つけられなかったのは、Cコードから戻ってくるポインタから逆参照された構造クラスを含むPythonオブジェクト(構造体のC関数を割り当てたC関数)それ自体が削除されます。元のC構造のメモリは解放されていますか?それをする方法でない場合は?

さらに、構造体にポインタ自体が含まれている場合、C関数によって割り当てられた他のデータにはどうなりますか? Structureオブジェクトの削除によってPointers onitsメンバーが解放されますか? (私はそうだと思う)Else - それをやろうとする?構造体のポインタのためにPythonからシステムを "フリー"にしようとすると、私のためにPythonがクラッシュします。

言い換えれば、私はCの関数コールで埋め、この構造を持っている:

class PIX(ctypes.Structure): 
    """Comments not generated 
    """ 
    _fields_ = [ 
     ("w", ctypes.c_uint32), 
     ("h", ctypes.c_uint32), 
     ("d", ctypes.c_uint32), 
     ("wpl", ctypes.c_uint32), 
     ("refcount", ctypes.c_uint32), 
     ("xres", ctypes.c_uint32), 
     ("yres", ctypes.c_uint32), 
     ("informat", ctypes.c_int32), 
     ("text", ctypes.POINTER(ctypes.c_char)), 
     ("colormap", ctypes.POINTER(PIXCOLORMAP)), 
     ("data", ctypes.POINTER(ctypes.c_uint32)) 
    ] 

を、私はそれがPythonコードからアップ使用しているメモリを解放します。

答えて

10

メモリは解放されません。なぜなら、Pythonは解放されるべきか、どのように解放されなければならないか分からないからです。

pix1, pix2 = PIX(), PIX() 
mylib.testfunc1(ctypes.byref(pix1)) 
mylib.testfunc2(ctypes.byref(pix2)) 

そして、いくつかの点で、pix1pix2がスコープの外に出る。このように使用

void testfunc1(PIX *pix) 
{ 
    static char staticBuffer[256] = "static memory"; 
    pix->text = staticBuffer; 
} 

void testfunc2(PIX *pix) 
{ 
    pix->text = (char *)malloc(32); 
    strcpy(pix->text, "dynamic memory"); 
} 

:これら二つの機能を比較。その場合、内部ポインタに何も起こりません。つまり、動的メモリを指している場合(pix2ではではありません。pix1ではありません)、あなたはそれを解放する責任があります。

この問題を解決する適切な方法は、Cコードにダイナミックメモリを割り当てる場合、そのメモリを解放する対応する関数を用意する必要があります。例:

void freepix(PIX *pix) 
{ 
    free(pix->text); 
} 


pix2 = PIX() 
mylib.testfunc2(ctypes.byref(pix2)) 
... 
mylib.freepix(ctypes.byref(pix2)) 
関連する問題