我使用Cython包装了许多C ++类,他们设法编译。但是,当我尝试使用python级别模块时,我遇到了分段错误(11),所以我想知道我的包装是对的。 A" Foo.h"是一个抽象的类。
source.pyx
cdef extern from "Foo.h":
cdef cppclass A:
A(MPI_comm comm, int x)
cdef extern from "Foo1.h":
cdef cppclass B:
B(A* obj, int y)
cdef class pyA:
cdef A *thisptrA
def __cinit__(self,MPI.Comm _comm, int x):
pass
def __dealloc__(self):
pass
cdef class pyB:
cdef B* thisptrB
cdef pyA obj
def __cinit__(self, pyA obj, int y):
self.thisptrB = new B(obj.thisptrA, y)
def __dealloc__(self):
del self.thisptrB
testscript.py
import pyA, pyB
class C(pyA):
def __init__(self, comm, x):
self.x = x
comm = MPI.COMM_WORLD
x = 2
y = 24
Aobj = C(comm, x)
Bobj = pyB(Aobj, y)
似乎每当我尝试初始化pyB时,语句
都会发生分段错误self.thisptrB = newB(obj.thisptrA, y)
有谁知道我哪里出错了?
答案 0 :(得分:0)
您不希望在thisptrA
中分配pyA
。因此,它指向的东西是空的或随机的(我不确定Cython是哪一个)。
导致分段错误的确切原因可能隐藏在B
的构造函数中,您不会将我们缩短。
您可能还需要考虑另外一件事:您可能希望确保A
的生命周期超过{I}的生命周期(我假设)拥有指向它的指针。这样做的一种方法是在B
内保持对PyA
的引用(即PyB
__init__
PyB
内的self._held_A = obj