有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java Do SWIG在carrays中的数组类。我可以释放它们包装的调用数组吗?

如果我有一个SWIG-wrapped C函数

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

我使用SWIG的array_classarray_functions,它们的delete函数会清理C分配的内存吗

也就是说,如果我使用array_class来定义%array_class(int, IntArray)并在Java中执行

IntArray ia = IntArray.frompointer(f());

ia超出范围时,或者如果使用array_functions,当我显式调用delete()时,f()返回的指针会被释放吗

array_class的源代码显示包装的数组类有一个析构函数:

~NAME() { delete [] self; }

而且{}已经

static void delete_##NAME(TYPE *ary) { %} %{ delete [] ary; %}

这让我相信它确实如此,但文档并没有这样说,我看到的许多示例都使用JNI代码创建了一个由C函数传递的数组副本,删除了原始数组,并将副本返回给Java。所以我不确定,随着包装的进行,这些delete函数到底删除了什么


共 (1) 个答案

  1. # 1 楼答案

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

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