我应该如何处理在__dealloc_中的cython PyObject中创建的临时np ndarray



我正在尝试更改一些代码,并且必须在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*指针,它很容易工作,我只想知道我是否应该释放自己。X_fake,或者我如何解除对临时ndarray的锁定,cython会通过gc工作流解除对numpy类的锁定吗?

正如@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