1

好的,有一个 C 方法调用了一个释放内存区域的指针。我不希望我的 java 绑定用户显式调用此方法,因为在 java 中它没有意义,这基本上是一种数据结构。

所以,我只是做了一个 finalize() 覆盖,把 c 调用放在那里。无论如何,人们说依靠finalize不好......你有更好的主意吗?

4

1 回答 1

2

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

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

有时可能的替代方法是创建直接 ByteBuffer 并将其传递给 C 库,而不是 C 库自己分配内存。当 ByteBuffer 对象被垃圾回收时,堆外缓冲区就会被释放。java.lang.ref顺便说一句,这是使用package中的幻像引用来实现的。

于 2014-03-21T14:33:03.140 回答