SWIG - 使用 %newobject 进行垃圾收集
在我的 C 代码中,我有以下结构:
typedef struct my_structure{
char* str1;
char* str2;
}MyStruct;
和一个返回 MyStruct 指针的函数:
MyStruct* foo();
在 foo 内部,我为 MyStruct 、 str1 和 str2 分配了内存,如下所示:
MyStruct* obj = malloc(sizeof(MyStruct));
obj.str1 = malloc(256);
obj.str2 = malloc(256);
我想从 python、java、C# 和 PHP 调用 foo我不想在这个过程中出现任何内存泄漏。
我不确定写入:
%newobject foo;
MyStruct* foo();
是否保证垃圾收集器将为结构及其内部的字符串释放内存。
我不想让调用者有义务为 str1 和 str2 显式释放内存,因为我正在寻找一种自动释放内存的方法。这可能吗?
在这种情况下我必须使用“newfree”类型映射吗?
如果您能为我提供一个示例来展示实现此目的的最佳方法,我将不胜感激。
谢谢!
In my C code, I have the following structure :
typedef struct my_structure{
char* str1;
char* str2;
}MyStruct;
And a function that returns a MyStruct pointer :
MyStruct* foo();
Inside foo, I have allocated memory for MyStruct , str1 and str2, as follows:
MyStruct* obj = malloc(sizeof(MyStruct));
obj.str1 = malloc(256);
obj.str2 = malloc(256);
I want to call foo from python, java, C# and PHP and I don't want to have any memory leak in this process.
I am not sure if writing:
%newobject foo;
MyStruct* foo();
guarantees that the garbage collector will free memory for both the structure and the strings inside it.
I didn't want to obligate the caller to explicit free memory for str1 and str2 as I was looking for an automatic way of freeing memory. Is this possible?
Do I have to use "newfree" typemap in this case?
I would greatly appreciate if you could provide me an example showing the best way to accomplish this.
Thanks!
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
typemap(newfree)
立即释放返回的%newobject
使用的内存,例如当 char* 返回值转换为 Python 字符串并且分配的对象不再是时需要。我认为您想要的是%extend
SWIG 围绕您的 C 结构生成的类包装器以提供析构函数:如果这解决了您的问题,请发表评论。这是基于我自己的实验,我可以在 SWIG 文档中找到并在我生成的简单包装器中正常工作。
typemap(newfree)
frees the memory used by the returned%newobject
immediately, such as when a char* return value is converted into a Python string and the allocated object is no longer needed. I think what you want is%extend
the class wrapper that SWIG generates around your C structure to provide a destructor:Please comment if this solves your issue. This is based on my own experimentation with what I could find in the SWIG documentation and worked correctly in the simple wrapper I generated.