2017-06-08 14 views
1
ffi = FFI() 
C = ffi.dlopen("mycffi.so") 


ffi.cdef(""" 
char* foo(T *t); 
void free_string(char *s); 
""") 

def get_foo(x): 
    cdata = C.foo(x) 
    s = ffi.string(cdata) 
    ret = s[:] 
    C.free_string(cdata) 
    return ret 

私がchar *をc関数からpythonに渡すと、pythonはそのメモリを解放します。しかし、どうしたらいいですか?cffiのc関数から返された文字列を正規化する方法はありますか?

私の現在の回避策は、Pythonで文字列をコピーして、すぐにCで文字列を解放することです。したがって、Pythonはretによって自動的に使用されるメモリを処理することができます。

これを行う正しい方法は何ですか?

答えて

1

それはsが既にcdata

def get_foo(x): 
    cdata = C.foo(x) 
    s = ffi.string(cdata) 
    C.free_string(cdata) 
    return s 
のコピーである、私は sをコピーする必要はありませんが判明します
関連する問題