gpt4 book ai didi

c++ - 使用 pybind11,如何为 array_t 对象设置底层内存的所有权?

转载 作者:太空宇宙 更新时间:2023-11-04 12:36:33 26 4
gpt4 key购买 nike

我正在尝试使用 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_dataarr_f2 范围之外仍然可用。如果以这种方式构建,看起来好像 array_t 充当“ View ”。

但是,在某些情况下,我可能希望 array_t 获得提供给 create_matrix 的内存的所有权。我如何告诉 array_t 它拥有内存?

最佳答案

如果您只是不传递数据指针,numpy 将为您分配内存。如果您无法控制分配,则必须自己销毁它(因为 numpy 不知道数据是如何分配的,而且似乎没有办法传递释放函数):

{
// 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

关于c++ - 使用 pybind11,如何为 array_t 对象设置底层内存的所有权?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56190354/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com