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 更深入的描述,说明删除指针两次意味着什么。
我正在做一个项目,我有一个 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 更深入的描述,说明删除指针两次意味着什么。