Как указал @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
это.