在我的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”类型映射?
如果您能提供一个示例来说明实现此目标的最佳方法,将不胜感激。
谢谢!
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文档中找到,并且可以在生成的简单包装程序中正常工作。