【问题标题】:How to use swig to modify class constructor to keep a reference to one of the constructor arguments?如何使用 swig 修改类构造函数以保持对构造函数参数之一的引用?
【发布时间】:2020-01-27 20:41:16
【问题描述】:

假设我有一个 C++ 类 MyArray(void* data, width, height),我想用 SWIG 将它包装到 Python。现在我有一个类型映射,它将一个 numpy 数组映射到数据、宽度和高度,我想保留一个 MyArray 对象而不复制,即使 numpy 数组超出范围。

如何覆盖/隐藏 MyArray 的构造函数,以存储对 numpy 数组的引用,以便 MyArray 保持 numpy 数组的引用计数?

【问题讨论】:

    标签: python c++ swig


    【解决方案1】:

    对不起,我的 Java 解决方案,但我确信转换为 Python 案例没有问题。我的解决方案基于其他答案Prevent premature garbage collection。在这种方法中,引用存储在高级语言包装器中的对象(在您的情况下为 Python)。为此,您可以使用 *.i 文件中的下一个代码(Java 案例示例):

    %define SAVE_REF(container, variable)
    %typemap(javacode) container %{
      private Object ref_ ## variable;
    %}
    
    %typemap(javaconstruct) container {
        ref_ ## variable = variable;
        swigCPtr = $imcall;
        swigCMemOwn = true;
    }
    %enddef
    

    然后在*.i中的类型声明之前

    SAVE_REF(my_awesome_container_t, element);
    
    ... type declaration ...
    

    【讨论】:

      猜你喜欢
      • 2021-03-18
      • 2018-02-20
      • 2019-08-09
      • 2017-04-01
      • 1970-01-01
      • 2018-11-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多