C++ 使用pybind11,如何设置数组对象的底层内存的所有权?

C++ 使用pybind11,如何设置数组对象的底层内存的所有权?,c++,pybind11,C++,Pybind11,我尝试用pybDun11在C++应用程序中进行Python嵌入。 我正在使用以下函数创建一个数组\u 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

我尝试用pybDun11在C++应用程序中进行Python嵌入。 我正在使用以下函数创建一个
数组\u 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);
}
{
    // 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
模板
py::数组创建矩阵(大小、宽度、大小、高度、t*data\u ptr=nullptr)
{
自动b=py::缓冲区信息(
数据存储,
sizeof(T),//itemsize
py::format_描述符::format(),
2,//ndim
向量{宽度,高度},//形状
向量{height*sizeof(T),sizeof(T)}//步幅
);
返回py::数组_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.
float*原始数组数据=新浮点[4];
{
py::array\u t arr\u f2=创建矩阵(2,2,原始数组数据);
...
}
//在此处使用原始数据数组。
raw_array_data
arr_f2
的范围之外仍然可用。如果以这种方式构造,
array\u t
似乎充当“视图”


但是,在某些情况下,我可能希望
数组_t
拥有提供给
创建矩阵
的内存。我怎样才能告诉数组它拥有内存呢?

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

{
//arr_f2将获得numpy以分配4个浮动
py::array_t arr_f2=创建矩阵(2,2);
...
}
//Python将在其减额时释放它们
float*原始数组数据=新浮点[4];
{
std::unique_ptr raw_array_data_析构函数(raw_array_data);
py::array\u t arr\u f2=创建矩阵(2,2,原始数组数据);
}
//和std::unique\u ptr::~unique\u ptr将删除[]数据

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

{
//arr_f2将获得numpy以分配4个浮动
py::array_t arr_f2=创建矩阵(2,2);
...
}
//Python将在其减额时释放它们
float*原始数组数据=新浮点[4];
{
std::unique_ptr raw_array_data_析构函数(raw_array_data);
py::array\u t arr\u f2=创建矩阵(2,2,原始数组数据);
}
//和std::unique\u ptr::~unique\u ptr将删除[]数据

谢谢。似乎使用
独特的\u ptr
会导致其他问题,尽管它在这种特殊情况下可以正常工作。谢谢。使用
unique\u ptr
似乎会导致其他问题,尽管它在这种特殊情况下可以正常工作。
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