У меня есть функция C++, которая выделяет массив и возвращает его. Я хочу использовать этот массив в Cython, а затем удалять его по завершении, но Cython, похоже, не доволен тем, как я пытаюсь это сделать. Самый тривиальный пример:
foo.hpp:
float * my_fun() { return new float[5]; }
foo.pyx:
cdef extern from "foo.hpp":
float * my_fun()
def my_other_fun():
cdef float * foo = my_fun()
del foo
Когда я пытаюсь использовать cython -a foo.pyx
я получаю ошибку " Deletion of non-Python, non-C++ object
. Что дает? Также, если есть способ сделать это, не выделяя кучу памяти, я все уши.
Память всегда должна быть освобождена так же, как она выделена. Вы просите о том, чтобы делать то, что вы делаете.
Я могу подумать о двух способах решения этой проблемы:
1) У вас есть функция удаления в C++, которую вы вызываете, чтобы освободить память.
2) Выделите память непосредственно из системной службы или вызова библиотеки (например, malloc) и используйте соответствующую функцию для освобождения памяти.
malloc
/ free
вызывает проблемы, если ваш код C ++ находится в другом двоичном файле.
new
иdel
в cython предназначены для объектов c ++, а не для массивов. Почему бы не использоватьvector
вместо?vector
. Кажется, что замена выделения памяти в стиле c ++ стилем c (malloc
иfree
) работает, хотя, пока я добавляюfrom libc.stdlib comport free
в началеfoo.pyx
.