我们在C ++中有指针的概念。现在,如果我们在C ++中分配一些内存并将其作为对象引用传递给Java(使用JNI)那么应该是谁以及谁将释放它。
会不会
1.)垃圾收集器是否在Java中自动执行?
2.)我们需要在包装的JNI类finalize方法中对指针进行显式删除吗?
3.)或者我们应该忘记finalize(因为终结器不能被信任)并且Java负责调用删除对象的C ++代码
4.)或者是否有某种方法可以直接在Java中释放内存(不确定Java是如何用C ++指针代表它来删除它的?)
执行此操作的最佳做法是什么,反之亦然(当我们将对象从Java传递到C ++时)?
答案 0 :(得分:8)
我们在C ++中有指针的概念。现在,如果我们在C ++中分配一些内存并将其作为对象引用传递给Java(使用JNI)那么应该是谁以及谁将释放它。
最好的策略通常是让分配器也是释放数据的那个。
1.)垃圾收集器是否在Java中自动执行?
这个问题是你不知道什么时候会运行。
2.)我们需要在包装的JNI类finalize方法中对指针进行显式删除吗?
最好在Java中使用release()方法而不是暗示C ++必须删除它。您可能希望C ++回收内存。
3.)或者我们应该忘记finalize(因为终结器不能被信任)并且Java负责调用删除对象的C ++代码
如果你的意思是,用Java分配内存并将其传递给C ++进行填充。这是我的偏好。
我会使用可以使用ByteBuffer.allocateDirect(),你可以调用((DirectBuffer) buffer).cleaner().clean();
来确定性地清理它。
这可以使回收内存更简单,可能在应用程序的生命周期中使用相同的缓冲区。