Hi, (dual posted to sage and cython)
A few of us (ipython and mpi4py devs) are wondering what the best/safest way of allocating dynamic memory in a local scope (method/function) is when using cython. An example would be if you need an array of c ints that is locally scoped. The big question is how to make sure that the memory gets freed - even if something goes wrong in the function/method. That is, you want to prevent memory leaks. It looks like in sage, the sage_malloc/sage_free functions are used for this purpose: from sage/graphs/graph_isom.pyx: 176 def incorporate_permutation(self, gamma): 202 cdef int *_gamma = <int *> sage_malloc( n * sizeof(int) ) 203 if not _gamma: 204 raise MemoryError("Error allocating memory.") 205 for k from 0 <= k < n: 206 _gamma[k] = gamma[k] 207 self._incorporate_permutation(_gamma, n) 208 sage_free(_gamma) Because sage_malloc is #defined to malloc in stdsage.h, I think there is a significant potential for memory leaks in code like this. Are we thinking correctly on this issue? Isn't this a huge problem? Lisandro Dalcin (author of mpi4py) came up with the following trick that, while more complicated, prevents memory leaks: cdef extern from "Python.h": object PyString_FromStringAndSize(char*,Py_ssize_t) char* PyString_AS_STRING(object) cdef inline object pyalloc_i(int size, int **i): if size < 0: size = 0 cdef Py_ssize_t n = size * sizeof(int) cdef object ob = PyString_FromStringAndSize(NULL, n) i[0] = <int*> PyString_AS_STRING(ob) return ob and now def foo(sequence): cdef int size = len(sequence), cdef int *buf = NULL cdef object tmp = pyalloc_i(size, &buf) This could probably be adapted into a malloc-like function. What do people think? Thanks, Brian --~--~---------~--~----~------------~-------~--~----~ To post to this group, send email to sage-devel@googlegroups.com To unsubscribe from this group, send email to [EMAIL PROTECTED] For more options, visit this group at http://groups.google.com/group/sage-devel URLs: http://www.sagemath.org -~----------~----~----~----~------~----~------~--~---