将python对象传递给Cython包装的类时出现段错误

时间:2015-03-10 15:38:16

标签: python c++ cython

我使用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)

有谁知道我哪里出错了?

1 个答案:

答案 0 :(得分:0)

您不希望在thisptrA中分配pyA。因此,它指向的东西是空的或随机的(我不确定Cython是哪一个)。

导致分段错误的确切原因可能隐藏在B的构造函数中,您不会将我们缩短。

您可能还需要考虑另外一件事:您可能希望确保A的生命周期超过{I}的生命周期(我假设)拥有指向它的指针。这样做的一种方法是在B内保持对PyA的引用(即PyB __init__ PyB内的self._held_A = obj