好的,有一个针对指针调用的 C 方法可以释放内存区域。 我不希望我的 java 绑定(bind)用户显式调用此方法,因为在 java 中它没有任何意义,这基本上是一个数据结构。
所以,我刚刚进行了 Finalize() 重写,将 c 调用放在那里。 不管怎样,人们都说依赖 Finalize 不好……你有更好的主意吗?
最佳答案
使用finalize
方法有一些问题:你无法保证何时或是否会调用它,它会迫使垃圾收集器做额外的工作,很容易出错.
释放资源是很常见的需求,无论它们是打开的文件描述符、窗口句柄、数据库结果集还是其他资源。在这些情况下,类具有显式的 close
和 dispose
方法,用户必须调用这些方法。我建议您按照这些类设置的示例并添加一个 close
方法。如果您实现 AutoCloseable
接口(interface),API 用户甚至可以使用 try-with-resources 语句,而不必显式调用 close()
。
有时可能的替代方案是创建直接 ByteBuffer 并将其传递给 C 库,而不是由 C 库自行分配内存。当 ByteBuffer 对象被垃圾收集时,堆外缓冲区将被释放。顺便说一句,这是使用 java.lang.ref
package 中的幻像引用来实现的。 .
关于java与免费c函数的绑定(bind): how to correctly free an object,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22511194/