有 Java 编程相关的问题?

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

垃圾收集java绑定与免费c函数:如何正确释放对象

好的,有一个在指针上调用的C方法可以释放内存区域。 我不希望我的java绑定用户明确地调用这个方法,因为在java中它没有意义,而且这基本上是一个数据结构

所以,我刚刚做了一个finalize()覆盖,将c调用放在那里。 不管怎么说,人们都说,依靠……是不好的。。。你有更好的主意吗


共 (1) 个答案

  1. # 1 楼答案

    使用finalize方法有几个问题:您无法保证何时或是否调用它,这会迫使垃圾收集器做额外的工作,很容易出错

    释放资源是非常常见的需求,无论它们是打开的文件描述符、窗口句柄、数据库结果集还是其他什么。在这些情况下,类具有显式的closedispose方法,用户必须调用这些方法。我建议您按照这些类设置的示例添加close方法。如果实现AutoCloseable接口,API用户甚至可以使用try with resources语句,而不必显式调用close()

    有时可能的替代方法是创建一个直接ByteBuffer并将其传递给C库,而不是C库自己分配内存。然后,当ByteBuffer对象被垃圾收集时,会释放堆外缓冲区。顺便提一下,这是使用来自^{} package的幻影引用实现的