cython
27 строк · 1.1 Кб
1from cython.cimports.cpython.mem import PyMem_Malloc, PyMem_Realloc, PyMem_Free
2
3@cython.cclass
4class SomeMemory:
5data: cython.p_double
6
7def __cinit__(self, number: cython.size_t):
8# allocate some memory (uninitialised, may contain arbitrary data)
9self.data = cython.cast(cython.p_double, PyMem_Malloc(
10number * cython.sizeof(cython.double)))
11if not self.data:
12raise MemoryError()
13
14def resize(self, new_number: cython.size_t):
15# Allocates new_number * sizeof(double) bytes,
16# preserving the current content and making a best-effort to
17# reuse the original data location.
18mem = cython.cast(cython.p_double, PyMem_Realloc(
19self.data, new_number * cython.sizeof(cython.double)))
20if not mem:
21raise MemoryError()
22# Only overwrite the pointer if the memory was really reallocated.
23# On error (mem is NULL), the originally memory has not been freed.
24self.data = mem
25
26def __dealloc__(self):
27PyMem_Free(self.data) # no-op if self.data is NULL
28