我正在编写一个Python包装器,用于调用具有以下签名的函数:
这段代码可以正确编译和执行(使用Cython 24.1,Python 3.5,VS2015)。我的担忧是是否一切都会被正确地释放/垃圾回收。我理解Python对
double** foo(double** arrayIn, int dim1, int dim2);
我需要在Python包装器中构建arrayIn
。一种可能的解决方案在这里给出。然而,由于Cython包括智能指针的支持,我更喜欢实现该解决方案。一种方法是使用malloc和带有自定义删除器的unique_ptr的组合。另一种(更简单)的解决方案是使用libcpp的allocator类。import numpy as np
cimport numpy as np
from libcpp.memory cimport unique_ptr, allocator
def testArray(int dim1, int dim2):
cdef allocator[double *] ptr_al
cdef unique_ptr[double *] myptr
cdef np.ndarray arr
cdef double[:,:] carr
myptr.reset(ptr_al.allocate(dim1))
arr = np.ndarray((dim1,dim2),dtype=np.float64,order='C')
carr = arr
myptr.get()[0] = &carr[0,0]
myptr.get()[1] = &carr[1,0]
myptr.get()[2] = &carr[2,0]
这段代码可以正确编译和执行(使用Cython 24.1,Python 3.5,VS2015)。我的担忧是是否一切都会被正确地释放/垃圾回收。我理解Python对
ndarray
负责,而unique_ptr
应该负责由allocator
创建的double *[]
。这是正确的吗?还是代码会造成内存泄漏?有没有办法验证所有内容是否已被正确释放?