pybind11返回对象的numpy数组 使用pybd11 C++ ++和python 3,我们如何在C++实现中正确创建一个对象的数组(即Unicode字符串)并返回到Python?传递到pybind11::array()的底层数据数组的确切内存布局是什么?我们究竟需要如何管理内存,即删除/释放内存

pybind11返回对象的numpy数组 使用pybd11 C++ ++和python 3,我们如何在C++实现中正确创建一个对象的数组(即Unicode字符串)并返回到Python?传递到pybind11::array()的底层数据数组的确切内存布局是什么?我们究竟需要如何管理内存,即删除/释放内存,c++,numpy,pybind11,C++,Numpy,Pybind11,请注意,这是必要的,因为我们希望在创建数据帧时将该字符串数组与其他POD数组一起使用。结果表明,有必要: 创建PyObject指针数组,填充数组,即 auto* pbuf = new PyObject*[arraySize]; // or create via pybind11 API... pbuf[0] = <new object...> pbuf[1] = <new object...> etc. 我帮不上忙pybind11。但是numpy数组可以使用numpy

请注意,这是必要的,因为我们希望在创建数据帧时将该字符串数组与其他POD数组一起使用。

结果表明,有必要:

  • 创建PyObject指针数组,填充数组,即

    auto* pbuf = new PyObject*[arraySize]; // or create via pybind11 API...
    pbuf[0] = <new object...>
    pbuf[1] = <new object...>
    etc.
    

  • 我帮不上忙
    pybind11
    。但是
    numpy
    数组可以使用
    numpy C API
    函数创建。阵列布局基本相同,属性加上数据缓冲区。对于对象类型,数据缓冲区包含指向内存中其他位置对象的指针。使用
    unicode
    dtype,缓冲区实际上包含字符串(填充到指定长度)。您可能需要学习
    numpy
    文档。谢谢-似乎最好的方法是手动创建带有对象的缓冲区,然后找出pybind11如何管理与底层数组以及所有对象关联的内存…您是否还知道一种不需要
    freeWhenDone
    的解决方案?我想,如果内存由pybind11 malloc'd,py::array可以使用正常的空闲时间。我能够让它工作而不泄漏的方法是使用一个胶囊。此外,当内部对象是python字符串时,我必须释放每个单独分配的对象。pybind11的较新版本可能还有其他解决方案。
    py::capsule freeWhenDone(pbuf, [](void* pp) {
            delete [] (PyObject*)pp; // or else properly free the pbuf memory
        });
    
    arr = py::array(py::dtype("object"),
        shape, strides, pbuf, freeWhenDone);