Вот что я собираюсь использовать с
cdef extern from *:
"""
template <typename T>
struct Ptr_deleter{
size_t nn;
void (*free_ptr)(T*, size_t);
Ptr_deleter(size_t nIn, void (*free_ptrIn)(T*, size_t)){
this->nn = nIn;
this->free_ptr = free_ptrIn;
};
void operator()(T* ptr){
free_ptr(ptr, nn);
};
};
template <typename T>
std::shared_ptr<T> ptr_to_sptr (T* ptr, size_t nn, void (*free_ptr)(T*, size_t)) {
Ptr_deleter dltr(nn, free_ptr);
std::shared_ptr<T> sp (ptr, dltr);
return sp;
};
"""
shared_ptr[double] d_ptr_to_sptr "ptr_to_sptr"(double* ptr, size_t nn, void (*free_ptr)(double*, size_t) nogil) nogil
cdef void free_d_ptr(double* ptr, size_t nn) nogil:
free(ptr)
cdef shared_ptr[double] sp_d_empty(size_t nn) nogil:
return d_ptr_to_sptr(<double*> nullCheckMalloc(nn*sizeof(double)), nn, &free_d_ptr)
Насколько я понимаю, «правильный» способ обработки массивов malloc
ed - это использование специального средства удаления, как это сделал я. Лично я предпочитаю использовать несколько необработанные C указатели (double*
вместо double[]
или что-то в этом роде), поскольку это более естественно в Cython и моих проектах.
Я думаю, довольно легко понять, как измените free_ptr
для более сложных типов данных. Для простых типов данных это можно было бы сделать с меньшим количеством строк и менее запутанным, но я хотел иметь такую же базу. необработанные указатели кода в shared_ptr
.
При работе с C ++ (особенно с новыми стандартами, такими как C ++ 20) я думаю, что очень часто требуется дословный код. Но я намеренно определил free_d_ptr
в Cython, поэтому можно легко использовать существующий код Cython для выполнения фактической работы, выполняемой для освобождения / очистки / любого массива.
Я не получил C ++ 11 std::arrays
для работы, и, по всей видимости, это «неправильно» возможно в Cython в целом (см. Взаимодействие массива C ++ 11 с Cython ).
Я не получил double[]
или аналогично работе (возможно в C ++ 20), но с дословным кодом C ++ я думаю, что это должно быть выполнено в Cython. Как я уже сказал, я предпочитаю больше C -подобных указателей / массивов.