使用PYBIND11,如何为Array_t对象设置基础内存的所有权
With pybind11, how do I set ownership of the underlying memory for an array_t object?
我正在尝试使用PYBIND11进行python嵌入。
我正在创建一个具有以下功能的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
它拥有内存?
如果您根本不传递数据指针,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
相关文章:
- 如何在自删除后将对象设置为nullptr
- QT:即使在static_cast后也无法在主窗口中设置对象的位置
- 将对象传递给 Java C++与使用 JNI 逐个设置对象参数
- V8 无法使用名称设置对象模板"console"
- 从函数返回 libconfig 类设置对象引用
- 当设置对象等于另一个函数的返回值时,为什么要调用移动构造函数/分配
- 在功能中设置对象变量
- 如何根据道具名称动态设置对象的属性?
- 如何传递unique_ptr来设置对象的成员变量?
- C++ 仅设置对象指向 nullptr 的指针
- 如何在涡轮C 图形中设置对象的自定义边框宽度
- 无法在 cocos2dx 中为 CCDictionary 设置对象
- 位掩码:通过集合方法设置对象的不同状态
- C++:如何从成员中设置对象
- 使用运算符设置对象>>
- 如何设置对象数据成员与这个c++与这个
- Q设置:移动/更改现有Q设置对象的范围/位置
- 在第一个可用索引处设置对象到C数组
- 如何设置对象转换,属性
- 在 C# 等C++中设置对象 = null 的替代方案是什么