And*_*Dev 5 c++ java java-native-interface opencv
我正在开发一个项目,其中有一个 Mat 是在本机代码的堆上分配的(应某些 Java 代码的请求),如下所示:
Mat* mat = new Mat(height, width, type, pointer_to_some_native_data_buffer);
Run Code Online (Sandbox Code Playgroud)
然后,我在 Java 中创建一个 Mat 对象,并使用从本机代码返回的指针将其指向该本机 Mat:
Mat javaHandleToNativeMat = new Mat(pointerFromNativeCode);
Run Code Online (Sandbox Code Playgroud)
从 Java 端对其进行一些处理后,我调用一个本机方法来释放一开始分配的 Mat:
delete (Mat*) ptr;
Run Code Online (Sandbox Code Playgroud)
我的问题是,当 GC 在指向本机 Mat 的 Java Mat 上运行终结器方法时,是否会发生本机内存损坏?
终结器代码如下:
@Override
protected void finalize() throws Throwable {
n_delete(nativeObj);
super.finalize();
}
Run Code Online (Sandbox Code Playgroud)
请注意,它调用n_delete(nativeObj). 我想知道这是否可能是一个问题,因为我之前在本机代码中删除了该对象。如果出现问题,解决问题的最佳方法是什么?我是否应该简单地调用release()本机 Mat,并允许它在 GC 运行时在终结器中实际删除?
由于您要删除本机Mat并且其实现n_delete是:
JNIEXPORT void JNICALL Java_org_opencv_core_Mat_n_1delete
(JNIEnv*, jclass, jlong self)
{
delete (Mat*) self;
}
Run Code Online (Sandbox Code Playgroud)
GC 会cv::Mat两次删除指针,这是不好的。您可以在这里找到关于两次删除指针意味着什么的更深入的描述。
| 归档时间: |
|
| 查看次数: |
354 次 |
| 最近记录: |