2017-11-25 6 views
0

나는 C++ 컴파일러와 함께 cython을 사용하고 있으며 이상한 세분화 오류 등이 발생합니다.이상한 버그 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]를

를 어떤 여기서 일어난거야? print 문이 구조체 내부의 벡터를 변경합니까? 나는 매우 혼란 스럽다.

답변

2

malloc은 메모리를 할당하지만 초기화하지는 않는다. 따라서 벡터를 할당하려 할 때 미미한 상태에 놓이게되고 예기치 않게 작동하여 세그먼트 화 오류가 발생하고이 경우 예측할 수없는 결과가 발생합니다. (정확히 언제 어떻게 분할 오류가 발생하는지 예측할 수 없다. 내 경우에는 파이썬이 닫혀서 벡터에 할당 된 것이 파이썬 내부를 덮어 쓴 것으로 보인다.)

vptr C++ 연산자 new (모든 구성 요소를 올바르게 초기화 함). 당신은 (이것은 ++ 사이 썬보다는 C를 달래하는 것입니다 - 구조체와 클래스 사이의 진정한 차이는 기본 멤버 액세스에서 떨어져 ++ C에 없다)

cdef cppclass vstruct: 

cdef struct vstruct: 

을 변경해야합니다.

그런 다음 기본 생성자와 함께 모든 구성 요소를 초기화하는 동안 메모리를 할당 할

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

vptr = new vstruct() 

로 변경합니다.

(당신이 del vptr를 사용하여 완료하면 당신은 또한 그것을 해제해야)

+0

멋진. 정확히 이것을하려고했지만 Cython은 new 키워드에 대해 불평했습니다. 나는 cppclass 키워드에 대해 몰랐다. 고맙습니다. 그렇다면 malloc을 사용하여 힙에 메모리를 할당하는 방법은 언제입니까? Cython C++에서 구조체를 사용하는 것이 합리적이지 않습니까? –

+0

malloc은 사소한 생성자/소멸자가있는 물건에 대해서만 정말로 괜찮습니다. 귀하의 구조체는 벡터가 없어도 괜찮 았지만 벡터가 메모리를 관리하기 때문에 초기화되고 C++ 방식으로 파괴되어야합니다. – DavidW