Travis E. Oliphant wrote: > Damian Eads wrote: >> This is good to know because there have been a few situations when this >> would have been very useful. >> >> Suppose I do something like (in Python): >> >> import ctypes >> mylib = ctypes.CDLL('libmylib.so') >> y = mylib.get_float_array_from_c_function() >> >> which returns a float* as a Python int, and then I do >> >> nelems = mylib.get_float_array_num_elems() >> x = numpy.frombuffer(ctypes.c_buffer(y), 'float', nelems) >> >> This gives me an ndarray x with its (.data) buffer pointing to the >> memory address give by y. When the ndarray x is no longer referenced >> (even as another array's base), does numpy attempt to free the memory >> pointed to by y? In other words, does numpy always deallocate the >> (.data) buffer in the __del__ method? Or, does fromarray set a flag >> telling it not to? > > NumPy won't free the memory unless the OWNDATA flag is set. Look at the > flags attribute. Frombuffer creates arrays that don't own there own > data, so you are safe. A reference is kept in the NumPy array to the > buffer object so it won't be deleted. > > The ctypes.c_buffer is a new one for me.
Unfortunately, it doesn't work the way it is used in Damian's example. It is a deprecated alias for create_string_buffer(), which creates a ctypes array of c_char from a string or a size. It does not make a buffer object from a ctypes pointer object or an address. -- Robert Kern "I have come to believe that the whole world is an enigma, a harmless enigma that is made terrible by our own mad attempt to interpret it as though it had an underlying truth." -- Umberto Eco _______________________________________________ Numpy-discussion mailing list Numpy-discussion@scipy.org http://projects.scipy.org/mailman/listinfo/numpy-discussion