我正在使用带有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语句是否会改变结构内部的向量?我很困惑
答案 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
完成它时,你也应该释放它)