stream.read()
은 buffer
이 가리키는 메모리를 할당합니다. 이 경우 C++ 공간에 할당 된 파이썬 공간 데이터로 돌아갈 수 없습니다. 당신은해야한다 :
1) 파이썬/사이 썬 코드
2, 선호하는 경우) 파이썬 객체, 또는 numpy
배열을 만들 할당 된 새 반짝 파이썬 객체에 *buffer
가 가리키는 할당 된 메모리에서 데이터를 복사 파이썬 공간에서. 그런 다음이 객체를 반환 할 수 있습니다.
파이썬이 어떤 식 으로든 C
공간에 할당 된 메모리를 처리 할 수 없기 때문에 필요합니다. C
코드에 의해 할당 된 메모리가 누수됩니다 (즉, 할당이 해제되지 않음).
이제는 cdef char *buffer = ''
으로 오류가 발생하지 않는 이유를 묻습니다. 후자의 경우, cython은 buffer
이 문자열을 가리킨다는 것을 인식하고 buffer
이 가리키는 내용으로 자동으로 새로운 파이썬 객체를 생성합니다. buffer
가 스택에 당신의 C
컴파일러에 의해 초기화됩니다
%%cython
def ReturnThisString():
cdef char *buffer = 'foobar'
return buffer
print ReturnThisString() #this outputs 'foobar'
공지 것을, 당신은 파이썬에서이 기능을 사용하면 문자열이 여전히 메모리 위치에있을 것이라는 보장은 없다 : 예 ipython
에 대해 다음과 같습니다. 그러나, cython 반환 문을 실행하면 자동으로 char *
포인터에서 파이썬 문자열을 초기화합니다. (파이썬 3에서는 @Veedrac이 말했듯이 bytes
으로 바뀌었지만, 이것은 사소한 부분입니다.) 이 두 번째 경우에는 파이썬 객체의 생성과 복사 작업이 숨겨져 있고 cython
에 의해 처리되지만 여전히 남아 있습니다.
stream.read()는'buffer'가 가리키는 메모리를 할당합니다. 이 경우 C++ 공간에 할당 된 파이썬 공간 데이터로 돌아갈 수 없습니다. – gg349
@flebool 어떻게 char에서 작동합니까? –
여기에 머무르기에는 너무 짧음 – gg349