如果我有一个swig包装的C函数
unsigned char* f()
{
unsigned char* ptr;
bar(ptr); //set ptr
return ptr;
}
和我使用array_class
或array_functions
来自SWIG的carrays.i
,他们的delete
函数清理c分配的内存吗?
也就是说,如果我使用array_class
来定义%array_class(int, IntArray)
并在Java中执行
IntArray ia = IntArray.frompointer(f());
当ia
超出作用域时,f()返回的指针会被释放吗?或者,如果使用array_functions
,当我显式调用delete()
时?
array_class
的源代码显示包装的数组类有析构函数:
~NAME() {
delete [] self;
}
和array_functions
有
static void delete_##NAME(TYPE *ary) { %}
%{ delete [] ary; %}
让我相信它是这样做的,但是文档并没有这样说,我看到的许多例子使用JNI代码创建C函数传递的数组的副本,删除原始数组,并将副本返回给Java。所以我不确定,随着所有包装的进行,这些delete
函数实际上删除了什么。
我发现swig生成的数组类的SwigOwn状态(决定它是否拥有本机内存)被设置为false。如果你将其更改为true,那么执行myArray.delete()确实会释放由
获取的本机内存。 myArray ma = myArray.frompointer(new SWIGTYPE_p_char(function_that_returns_native_ptr))