[英]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.