Pax*_*a99 5 memory arrays smart-pointers cython
我正在为带有签名的函数调用编写 Python 包装器
double** foo(double** arrayIn, int dim1, int dim2);
并且需要arrayIn在我的 Python 包装器中构建。这里给出了一种可能的解决方案。但是,由于 Cython 包括对智能指针的支持,我更愿意实施该解决方案。一种方法是将malloc 和 unique_ptr 与自定义删除器结合使用。另一个(更简单的)解决方案是使用libcpp 中的分配器类。
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]
Run Code Online (Sandbox Code Playgroud)
此代码编译并正确执行(使用 Cython 24.1、Python 3.5、VS2015)。我担心的是一切是否都会被正确释放/垃圾收集。我的理解是,Python是负责的ndarray,并unique_ptr应负责double *[]的创建allocator。这是正确的,还是代码会造成内存泄漏?有没有办法可以验证所有内容都已正确解除分配?
这是正确的,还是代码会造成内存泄漏?
我认为这不应该泄露。
有没有办法可以验证所有内容是否已正确释放?
您可以testArray循环调用并查看进程内存是否线性增长或保持不变。由于您知道dim1和dim2,因此如果某些内容未正确释放,您可以估计内存泄漏大小。
在更复杂的情况下,还有其他方法可以测试内存泄漏:C 库的调试版本会告诉您是否已释放分配的所有内存。另外,还有诸如valgrind, 和clang's 之类的工具leaksanitizer,但就您而言,我会使用循环。