使用带有c ++的cython访问结构中的向量的奇怪错误

时间:2017-11-25 18:57:19

标签: python c++ c struct cython

我正在使用带有c ++编译器的cython,我得到了奇怪的分段错误等。

我的问题可以用这段代码总结:

from libc.stdlib cimport malloc,free
from libcpp.vector cimport vector
from libcpp.string cimport string

cdef struct vstruct:
    int a
    double b
    vector[int] v    
cpdef main():
    cdef vstruct* vptr
    vptr = <vstruct*> malloc(sizeof(vstruct))
    vptr[0].v = [1,2]
    print vptr[0].v
    print vptr[0].v

main()

产生输出:

[1,2]
[0,0]

那么,这里发生了什么? print语句是否会改变结构内部的向量?我很困惑

1 个答案:

答案 0 :(得分:2)

malloc分配但不初始化内存。因此,当您尝试分配向量并且行为不可预测时,向量处于欠定状态,在这种情况下会导致分段错误和不可预测的输出。 (究竟何时以及如何发生分段错误也是不可预测的 - 在我的情况下,它似乎是在Python关闭的时候,这可能表明对向量的赋值覆盖了一些Python内部。)

您需要做的是使用C ++运算符vptr分配new(它会正确初始化所有组件)。你需要改变

cdef struct vstruct:

cdef cppclass vstruct:

(这是为了安抚Cython而不是C ++ - 除了默认的成员访问之外,C ++中的结构和类之间没有真正的区别。)

然后你改变

vptr = <vstruct*> malloc(sizeof(vstruct))

vptr = new vstruct()

在使用默认构造函数初始化所有组件时分配内存。

(当你使用del vptr完成它时,你也应该释放它)