Commit 39d9e0fc authored by Stefan Behnel's avatar Stefan Behnel

improve error handling in malloc tutorial example

parent b1b0ef44
......@@ -73,24 +73,28 @@ to a Python object to leverage the Python runtime's memory management,
e.g.::
cdef class SomeMemory:
cdef double* data
def __init__(self, number):
def __cinit__(self, number):
# allocate some memory (filled with random data)
self.data = <double*> malloc(number * sizeof(double))
if self.data == NULL:
self.data = <double*> PyMem_Malloc(number * sizeof(double))
if not self.data:
raise MemoryError()
def resize(self, new_number):
# Allocates new_number * sizeof(double) bytes,
# preserving the contents and making a best-effort to
# re-use the original data location.
self.data = <double*> realloc(self.data, new_number * sizeof(double))
mem = <double*> PyMem_Realloc(self.data, new_number * sizeof(double))
if not mem:
raise MemoryError()
# Only overwrite the pointer if the memory was really reallocated.
# On error (mem is NULL), the originally memory has not been freed.
self.data = mem
def __dealloc__(self, number):
if self.data != NULL:
free(self.data)
PyMem_Free(self.data) # no-op if self.data is NULL
It should be noted that Cython has special support for (multi-dimensional)
arrays of simple types via NumPy and memory views which are more full featured
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment