cython
27 строк · 983.0 Байт
1from cpython.mem cimport PyMem_Malloc, PyMem_Realloc, PyMem_Free
2
3
4cdef class SomeMemory:
5cdef double* data
6
7def __cinit__(self, size_t number):
8# allocate some memory (uninitialised, may contain arbitrary data)
9self.data = <double*> PyMem_Malloc(
10number * sizeof(double))
11if not self.data:
12raise MemoryError()
13
14def resize(self, size_t new_number):
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 = <double*> PyMem_Realloc(
19self.data, new_number * sizeof(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