Ich habe dieses Beispiel-Code, der eine Funktion text()
Zurückgeben eines neu zugewiesenen String hat:Muss ich den von einer über CFFI aufgerufenen C-Funktion zurückgegebenen Speicher freigeben?
ffi_test = FFI()
ffi_test.set_source('_test', '''
char* test() { return strdup("hello world"); }
''')
ffi_test.cdef('''
char* test();
void free(void *);
''')
ffi_test.compile(verbose=True)
Dies funktioniert:
In [1]: from _test import ffi, lib
In [2]: x = lib.test()
In [3]: ffi.string(x)
Out[3]: b'hello world'
In [4]: lib.free(x)
Allerdings konnte ich nichts in der Dokumentation, ob ich wirklich brauchen zu manuell free()
die zurückgegebene Zeichenfolge von, wenn CFFI Besitz des Zeigers übernimmt, sobald es an Python-Code zurückgegeben wird.
Auch, wenn ich brauche, um manuell free()
es, ich free()
in meinem cdefs aussetzen müssen oder nicht CFFI etwas schönere Art und Weise für sie zur Verfügung stellen?
Wenn „Besitz“ eines Objekts von einer Softwarekomponente zur anderen weitergegeben wird, wird der neue Eigentümer für die Freigabe zuständige Erinnerung. Weil * das ist, was "Besitz" bedeutet. * – kindall