我正在尝试使用pybind11将python嵌入到C ++应用程序中。
我正在使用以下功能创建一个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
它拥有内存?
答案 0 :(得分:0)
如果您只是不传递数据指针,则numpy将为您分配内存。如果您无法控制分配,则必须自己销毁它(因为numpy不会知道数据是如何分配的,而且似乎也没有传递deallocator函数的方法):
{
// arr_f2 will get numpy to allocate 4 floats
py::array_t<float> arr_f2 = create_matrix<float>(2, 2);
...
}
// and Python will deallocate them when it gets decrefd
float* raw_array_data = new float[4];
{
std::unique_ptr<float[]> raw_array_data_destructor(raw_array_data);
py::array_t<float> arr_f2 = create_matrix<float>(2, 2, raw_array_data);
}
// And std::unique_ptr<float[]>::~unique_ptr will delete[] the data