繁体   English   中英

在C ++中使用cython访问结构中的向量的怪异错误

[英]Weird bug accessing a vector in a struct using cython with c++

我正在将cython与c ++编译器一起使用,并且遇到了奇怪的分段错误等。

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

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]

那么,这里发生了什么? 打印语句会改变结构内部的向量吗? 我很困扰

malloc分配但不初始化内存。 因此,当您尝试为其分配向量时,向量处于欠定义状态,并且其行为将不可预测,从而导致分段错误和这种情况下的不可预测的输出。 (确切地说,分割错误的发生时间和方式也是无法预测的-在我的情况下,似乎是Python关闭的时间,这可能表明向量的分配已覆盖了某些Python内部函数。)

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

cdef struct vstruct:

cdef cppclass vstruct:

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

然后你改变

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

vptr = new vstruct()

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

(使用del vptr完成操作后,还应该释放它)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM