c++ - 使用 pybind11,如何为 array_t 对象设置底层内存的所有权?
问题描述
我正在尝试使用 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
's 范围之外使用。如果以这种方式构建,看起来好像array_t
是充当“视图”。
但是,在某些情况下,我可能希望获得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
推荐阅读
- django - Django 'ManagementForm 数据丢失或已被篡改'外部多对多外键
- powershell - 解析子目录中的日志文件
- typescript - Vue2 + 组合 API - 动态模板引用
- python - Python将派生类组合到同一个基类?
- android - 当我删除我的 firebase 数据库上的记录时出现问题
- openpyxl - 写入现有的 xlsm 文件
- azure-devops-rest-api - 在 Azure Devops Rest API 中创建或更新工作项时如何设置工作项状态?
- css - 如何使用 Material UI 覆盖 Amplify 主题
- c# - 获取 Telerik 表的新列数据
- authentication - 使用 LinkedIn 登录返回“应用程序已禁用”