java-связывание со свободной функцией c: как правильно освободить объект

1

Хорошо, есть метод C, вызываемый указателем, который освобождает область памяти. Я не хочу, чтобы мой java-связывающий пользователь явно вызывал этот метод, потому что в java это не имеет смысла, и это в основном структура данных.

Итак, я только что сделал finalize(), переопределив вызов c. В любом случае люди говорят, что нехорошо полагаться на финализацию... есть ли у вас идея?

Теги:
garbage-collection
jni
jna
finalize

1 ответ

1
Лучший ответ

Есть несколько проблем с использованием метода finalize: у вас нет гарантии того, когда или когда он будет вызван, он заставит сборщика мусора выполнять дополнительную работу, легко получить его неправильно.

Очень часто необходимо освобождать ресурсы, будь то открытые файловые дескрипторы, дескрипторы окон, базы данных, набор результатов или что-то еще. В этих случаях классы имеют явные методы close и dispose, которые должен вызывать пользователь. Я предлагаю вам следовать примеру, заданному этими классами, и добавить метод close. Если вы реализуете интерфейс AutoCloseable пользователь API даже сможет использовать оператор try-with-resources и не должен явно вызывать AutoCloseable close().

Альтернативой, которая иногда бывает, является создание прямого ByteBuffer и передача его в библиотеку C, а не библиотеку C, выделяющую память самостоятельно. Затем буфер-куча освобождается, когда объект ByteBuffer собирает мусор. Кстати, это реализовано с использованием фантомных ссылок из пакета java.lang.ref.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню