opencvjni:java/mat的本机处理-delete是否可能被调用两次?

xcitsw88  于 2021-06-30  发布在  Java
关注(0)|答案(1)|浏览(308)

我正在做一个项目,在这个项目中,我有一个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的javamat上运行finalizer方法时,是否会发生本机内存损坏?
终结器代码如下:

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

注意,它调用 n_delete(nativeObj) . 我想知道这是否是一个问题,因为我以前删除了本机代码中的对象。如果是一个问题,什么是解决问题的最佳方法?我应该打电话吗 release() 并允许在gc运行时在终结器中实际删除它?

dsekswqp

dsekswqp1#

因为你要删除本机 Mat 以及 n_delete 是:

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

gc将删除 cv::Mat 指针两次,这是不好的。您可以在这里找到关于删除指针两次意味着什么的更深入的描述。

相关问题