如果我有SWIG包装的C函数
unsigned char* f()
{
unsigned char* ptr;
bar(ptr); //set ptr
return ptr;
}
我使用SWIG' array_class
中的array_functions
或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
函数到底实际删除了什么。
答案 0 :(得分:0)
我发现SWIG生成的数组类的SwigOwn状态决定了它是否拥有本机内存,因此设置为false。如果将其更改为true,那么执行myArray.delete()确实会释放它所获取的本机内存,例如,
myArray ma = myArray.frompointer(new SWIGTYPE_p_char(function_that_returns_native_ptr))