SWIG-使用%newobject进行垃圾收集

Fab*_*ral 5 c swig

在我的C代码中,我具有以下结构:

typedef struct my_structure{
    char* str1;
    char* str2;
}MyStruct;
Run Code Online (Sandbox Code Playgroud)

还有一个返回MyStruct指针的函数:

MyStruct* foo();
Run Code Online (Sandbox Code Playgroud)

在foo内部,我为MyStruct,str1和str2分配了内存,如下所示:

MyStruct* obj = malloc(sizeof(MyStruct));

obj.str1 = malloc(256);
obj.str2 = malloc(256);
Run Code Online (Sandbox Code Playgroud)

我想从python,java,C#和PHP调用foo,并且我不想在此过程中发生任何内存泄漏。

我不确定是否写:

%newobject foo;
MyStruct* foo();
Run Code Online (Sandbox Code Playgroud)

保证垃圾收集器将为结构和其中的字符串释放内存。

我不想让调用者有义务为str1和str2显式释放内存,因为我正在寻找一种自动释放内存的方法。这可能吗?

在这种情况下是否必须使用“ newfree”类型映射?

如果您能提供一个示例来说明实现此目标的最佳方法,将不胜感激。

谢谢!

Mar*_*nen 5

typemap(newfree)%newobject立即释放返回者使用的内存,例如当char *返回值转换为Python字符串并且不再需要分配的对象时。我认为您想要的是%extendSWIG围绕C结构生成的类包装器,以提供析构函数:

%newobject foo;

%extend MyStruct {
    ~MyStruct() {
       free($self->str1);
       free($self->str2);
    }
}
Run Code Online (Sandbox Code Playgroud)

如果可以解决您的问题,请发表评论。这是基于我自己的实验,可以在SWIG文档中找到,并且可以在生成的简单包装程序中正常工作。