Свободная память JNA, выделенная разделяемой библиотекой

1

В моем C API есть следующие функции:

MyStruct *create();
void destroy(MyStruct **s);

Я сопоставляю их с помощью JNA:

Pointer create();
void destroy(Pointer p);

У меня есть класс, который загружает общую библиотеку и использует эти функции:

class MyClass{

    private mySharedLibrary library;
    private Pointer p;

    public MyClass(){
       this.library = (MySharedLibrary)Native.loadLibrary("mylibrary", MySharedLibrary.class);
       this.p = library.create();
    }
}

Я не знаю, когда и как вызвать функцию destroy... Или я не должен ее вообще называть? В Java нет деструкторов. Более того, он получает MyStrct ** в качестве аргумента... Что мне делать?

  • 0
    Вы уверены, что ваша подпись destroy верна? Похоже, что он принимает адрес значения, возвращаемого create , а не само значение.
Теги:
memory-leaks
jna

1 ответ

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

Ваш класс должен предоставить явное destroy, которое затем вызывается с использованием шаблона try-with-resources.

Если try-with-resources недоступны для вас и по какой-либо причине не используют явную очистку, вы можете использовать финализатор. Хотя они не гарантируются, в большинстве случаев это, вероятно, достаточно хорошо.

class MyClass {
    private Object finalizer = new Object {
        protected void finalize() {
            if (MyClass.this.p != null) {
                MyClass.this.library.destroy(MyClass.this.p);
                MyClass.this.p = null;
            }
        }
    }
}

Обратите внимание, что вы должны тщательно протестировать свой собственный прецедент, чтобы гарантировать, что память будет исправлена в соответствии с вашими потребностями.

Ещё вопросы

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