Je suis très nouveau pour ctypes, et je reçois une erreur avec le programme simple ci-dessous.Pourquoi ai-je une erreur de segmentation ici? [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())
La faute de segmentation se produit quand je l'appelle libfoo.Foo_bar(self.foo)
, mais selon this answer, je pensais que tout ce que je devais faire était de faire une référence forte via self.foo
afin qu'il ne soit pas ramassé.
Je suppose que Foo
est créé sur la pile dans le fichier CPP, il est donc immédiatement effacé après l'appel de la fonction. En tout cas, comment puis-je résoudre ce problème?
ctypes n'a aucune idée de ce que l'une de ces fonctions prend ou retourne. Par exemple, il n'a aucune idée de ce qu'est un «Foo *» et aucune idée que «Foo_new» en retourne un. – user2357112
La récupération de place entre en jeu pour les rappels ctypes, pas pour un pointeur vers un objet qui n'a rien à voir avec Python. C'est la segfault ici parce que le type de résultat de l'entier par défaut et la conversion de l'argument est un C 'int' de 32 bits, qui tronquera un pointeur de 64 bits. – eryksun