我正在尝试更改一些代码,并且必须在cython类中创建一个np.ndarray
cdef class T:
def __cinit__(self, X):
# copy a memory space by the numpy way
cdef np.ndarray temp = np.ndarray(shape=X.shape, dtype=X.dtype)
self.X_fake = <DTYPE_t*> temp.data
def __dealloc__(self):
# should I free this?
free(self.X_fake)
我在numpy或cython doc中找不到任何内容。我知道如果我使用malloc创建DTYPE_t *指针,那么它很容易工作,我只是想知道是否应该释放self.X_fake,或者我如何才能释放temp ndarray,所以cython将通过gc工作流释放一个numpy类?
答案 0 :(得分:0)
正如@ead指出的那样,当前temp
是一个自动变量,它将在__cinit__
的末尾超出范围。这意味着self.X_fake
不会指向任何内容,并可能会导致您遇到问题。这是修复代码的最简单方法:
import numpy as np
cimport numpy as np
ctypedef np.float64_t DTYPE_t
cdef class T:
cdef np.ndarray temp
cdef DTYPE_t* X_fake
def __cinit__(self, X):
# copy a memory space by the numpy way
self.temp = np.ndarray(shape=X.shape, dtype=X.dtype)
self.X_fake = <DTYPE_t*> self.temp.data
这样,temp
将共享其所属的T
实例的生存期。您不需要__dealloc__
。当temp
超出范围时,将自动清除T
的给定实例中的所有其他内容。
此外,您还将知道是否必须free
属于指针的内存,因为在这种情况下,首先要使用malloc
创建它。如果您没有malloc
,请不要free
。