3

我正在创建小型 GUI 系统,我想使用 python、cairo 和 pystacia 库进行渲染。对于 C++/Python 交互,我使用的是 Boost Python,但我遇到了指针问题。

我见过这种问题被问过几次,但不太明白如何解决。

如果我有一个只有图像数据指针的 strcut/class:

struct ImageData{
    unsigned char* data;
    void setData(unsigned char* data) { this->data = data; } // lets assume there is more code here that manages memory
    unsigned char* getData() { return data; }
}

我怎样才能让python可以做到这一点(C++):

 ImageData myimage;
 myimage.data = some_image_data;
 global["myimage"] = python::ptr(&myimage);

在python中:

 import mymodule
 from mymodule import ImageData
 myimagedata = myimage.GetData()
 #manipulate with image data and those manipulations can be read from C++ data pointer that is passed

我的代码用于调用将传递的 ptr 传递给类的基本方法。这可能是基本用例,但我无法使其工作。我试过 shared_ptr 但失败了。是否应该使用 shared_ptr、代理类或其他方式来解决?

4

1 回答 1

0

您的变量的局部性存在问题:当您超出其范围时, myimage 将被删除。要解决此问题,您可以使用动态内存分配创建它,然后移动指针到 python:

ImageData * myimage = new ImageData();
myimage->data = new ImageRawData(some_image_data); // assuming copy of the buffer
global["myimage"] = boost::python::ptr(myimage);

请注意,这不负责 python 上的内存处理。您应使用 boost::python::handle<> 正确声明您正在将内存管理转移到 python。

于 2020-04-09T12:59:46.763 回答