OpenCV JNI:Java/native 处理 Mat - delete 被调用两次的可能性?

OpenCV JNI: Java/native handling of Mat - possibility for delete getting called twice?

我正在做一个项目,我有一个 Mat,它以本机代码的形式分配在堆上(应某些 Java 代码的请求),如下所示:

Mat* mat = new Mat(height, width, type, pointer_to_some_native_data_buffer);

然后我在 Java 中创建一个 Mat 对象,并使用从本机代码返回的指针将其指向该本机 Mat:

Mat javaHandleToNativeMat = new Mat(pointerFromNativeCode);

在Java端对它做了一些处理后,我调用了一个本地方法来释放一开始分配的Mat:

delete (Mat*) ptr;

我的问题是,当 GC 在指向本机 Mat 的 Java Mat 上运行终结器方法时,是否会发生本机内存损坏?

finalizer代码如下:

    @Override
    protected void finalize() throws Throwable {
        n_delete(nativeObj);
        super.finalize();
    }

注意它调用了 n_delete(nativeObj)。我想知道这是否是个问题,因为我之前在本机代码中删除了该对象。如果是问题,解决问题的最佳方法是什么?我是否应该简单地在原生 Mat 上调用 release(),并允许它在 GC 运行时在终结器中实际删除?

由于您要删除本机 Mat 并且 n_delete 的实现是:

JNIEXPORT void JNICALL Java_org_opencv_core_Mat_n_1delete
  (JNIEnv*, jclass, jlong self)
{
    delete (Mat*) self;
}

GC 将删除 cv::Mat 指针两次,这是错误的。您可以找到 here 更深入的描述,说明删除指针两次意味着什么。