carrays.i 中的 SWIG 数组类是否释放了它们包装的 C 分配数组?



如果我有一个swig包装的C函数

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

和我使用array_classarray_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))

最新更新