Ich bin sehr neu zu Ctypes, und ich bekomme einen Fehler mit dem einfachen Programm unten.Warum bekomme ich hier einen Segmentierungsfehler? [Python ctypes]
foo.cpp
class Foo {
public:
int bar;
Foo(int bar): bar(bar) {}
};
extern "C" {
Foo * Foo_new(int bar) {
return new Foo(bar);
}
int Foo_bar(Foo *foo) {
return foo->bar;
}
}
foo.py
import ctypes
libfoo = ctypes.CDLL('libfoo.so')
class Foo:
def __init__(self, bar):
self.foo = libfoo.Foo_new(bar)
def bar(self):
return libfoo.Foo_bar(self.foo)
foo = Foo(5)
print(foo.bar())
Der Segmentierungsfehler passiert, wenn ich libfoo.Foo_bar(self.foo)
nennen, aber nach this answer, dachte ich alles, was ich brauchte, war zu tun, eine starke Referenz machen über self.foo
, so dass es nicht Müll gesammelt wurde.
Meine Vermutung ist, dass Foo
auf dem Stapel in der CPP-Datei gemacht wird, so dass es sofort nach dem Funktionsaufruf gelöscht wird. In jedem Fall, wie repariere ich das?
ctypes hat keine Ahnung, welche Funktionen diese Funktionen übernehmen oder zurückgeben. Zum Beispiel hat es keine Ahnung, was ein 'Foo *' ist und keine Ahnung, dass 'Foo_new' einen zurückgibt. – user2357112
Garbage Collection kommt für Ctypes-Callbacks ins Spiel, nicht für einen Zeiger auf ein Objekt, das nichts direkt mit Python zu tun hat. Es wird hier segzufällig, weil die Standard-Integer-Ergebnistyp- und -argumentkonvertierung ein 32-Bit-C-int-Wert ist, der einen 64-Bit-Zeiger abschneidet. – eryksun