在carrays中做SWIG的数组类。它们包含了免费的C分配数组吗?

时间:2016-08-22 14:57:14

标签: java arrays swig

如果我有SWIG包装的C函数

unsigned char* f() { unsigned char* ptr; bar(ptr); //set ptr return ptr; }

我使用SWIG' array_class中的array_functionscarrays.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函数到底实际删除了什么。

1 个答案:

答案 0 :(得分:0)

我发现SWIG生成的数组类的SwigOwn状态决定了它是否拥有本机内存,因此设置为false。如果将其更改为true,那么执行myArray.delete()确实会释放它所获取的本机内存,例如,

 myArray ma = myArray.frompointer(new SWIGTYPE_p_char(function_that_returns_native_ptr))