Я хочу использовать C++ shared_ptr в качестве замены необработанных указателей C. В качестве простого примера следующий код работает так, как задумано:
from libcpp.memory cimport shared_ptr, allocator
cdef shared_ptr[double] spd
cdef allocator[double] allo
spd.reset(allo.allocate(13))
Размер выбран здесь равным 13, но обычно он неизвестен во время компиляции. Я не уверен, что это правильно, но у меня не было никаких ошибок (пока нет утечек памяти и segfaults). Мне любопытно, есть ли более оптимальное решение с make_shared.
Но я не могу использовать массивы С++ 11, потому что Cython не позволяет использовать литералы в качестве шаблонов, например. что-то вроде
cdef shared_ptr[array[double]] spd = make_shared[array[double,13]]()
и обычные массивы, которые должны работать с компилятором С++ 20 (например, gcc 10), так или иначе вызывают проблемы:
# Cython error "Expected an identifier or literal"
cdef shared_ptr[double[]] spd = make_shared[double[]](3)
# Can't get ptr to work
ctypedef double[] darr
cdef shared_ptr[darr] spd = make_shared[darr](13)
cdef double* ptr = spd.get() # or spd.get()[0] or <double*> spd.get()[0] or ...
Является ли решение распределителя правильным и лучшим или есть другой способ сделать это?