Выделить память в C ++, а затем освободить ее в Cython?

0

У меня есть функция 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. Что дает? Также, если есть способ сделать это, не выделяя кучу памяти, я все уши.

  • 0
    читая документацию, new и del в cython предназначены для объектов c ++, а не для массивов. Почему бы не использовать vector вместо?
  • 0
    У меня тоже были проблемы с vector . Кажется, что замена выделения памяти в стиле c ++ стилем c ( malloc и free ) работает, хотя, пока я добавляю from libc.stdlib comport free в начале foo.pyx .
Теги:
cython
memory-management

1 ответ

3

Память всегда должна быть освобождена так же, как она выделена. Вы просите о том, чтобы делать то, что вы делаете.

Я могу подумать о двух способах решения этой проблемы:

1) У вас есть функция удаления в C++, которую вы вызываете, чтобы освободить память.

2) Выделите память непосредственно из системной службы или вызова библиотеки (например, malloc) и используйте соответствующую функцию для освобождения памяти.

  • 0
    Даже использование malloc / free вызывает проблемы, если ваш код C ++ находится в другом двоичном файле.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню