I am writing a Python wrapper for a function call with the signature
double** foo(double** arrayIn, int dim1, int dim2);
and need to build arrayIn
inside my Python wrapper. One possible solution for this is given here. However, since Cython includes support for smart pointers, I would prefer to implement that solution. One way to do this would be a combination of malloc and a unique_ptr with a custom deleter. Another (simpler) solution would be to use the allocator class from 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]
This code compiles and executes correctly (with Cython 24.1, Python 3.5, VS2015). My concern is whether or not everything will be properly deallocated / garbage collected. My understanding is that Python is responsible for the ndarray
, and unique_ptr
should be responsible for the double *[]
created by allocator
. Is this correct, or will the code create a memory leak? Is there a way I could verify that everything has been properly deallocated?
Is this correct, or will the code create a memory leak?
I don't think this should leak.
Is there a way I could verify that everything has been properly deallocated?
You can call testArray
in a loop and see if the process memory is growing linearly or stays about constant. Since you know dim1
and dim2
, you can estimate the memory leak size if something isn't freed properly.
There are other ways to test for memory leaks, in more complicated situations: there are debug versions of the C library that will tell you if you've deallocated all of the memory you allocated. Also, there are tools like valgrind
, and clang
's leaksanitizer
, but in your case I'd go with the loop.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With