Я пытаюсь сделать встраивание Python в приложение C ++ с pybind11.
Я создаю array_t
со следующей функцией:
template<class T>
py::array_t<T> create_matrix(size_t width, size_t height, T* data_ptr = nullptr)
{
auto b = py::buffer_info(
data_ptr,
sizeof(T), //itemsize
py::format_descriptor<T>::format(),
2, // ndim
std::vector<size_t> { width, height }, // shape
std::vector<size_t> {height * sizeof(T), sizeof(T)} // strides
);
return py::array_t<T>(b);
}
Если я использую эту функцию следующим образом:
float* raw_array_data = new float[4];
{
py::array_t<float> arr_f2 = create_matrix<float>(2, 2, raw_array_data);
...
}
// Use raw_data_array here.
raw_array_data
все еще доступны за пределами arr_f2
.Похоже, что array_t
действует как «представление», если построен таким образом.
Однако в некоторых случаях я могу пожелать, чтобы array_t
стал владельцем памяти, поставляемой для create_matrix
.Как я могу сказать array_t
, что ему принадлежит память?