簡體   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