【问题标题】:JNA free memory allocated by shared library共享库分配的 JNA 空闲内存
【发布时间】:2014-07-02 13:58:51
【问题描述】:

我的 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** 作为参数......我该怎么办?

【问题讨论】:

  • 您确定您的destroy 签名正确吗?看起来它采用了create 返回的值的地址,而不是值本身。

标签: java c memory-leaks jna


【解决方案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;
            }
        }
    }
}

请注意,您应该在自己的用例中进行广泛的测试,以确保根据您的需要回收内存。

【讨论】:

    猜你喜欢
    • 2011-07-13
    • 2010-11-13
    • 2014-11-24
    • 2018-10-09
    • 1970-01-01
    • 2015-03-21
    • 1970-01-01
    • 1970-01-01
    • 2011-07-26
    相关资源
    最近更新 更多