我正在做一个项目,在这个项目中,我有一个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运行时在终结器中实际删除它?
1条答案
按热度按时间dsekswqp1#
因为你要删除本机
Mat
以及n_delete
是:gc将删除
cv::Mat
指针两次,这是不好的。您可以在这里找到关于删除指针两次意味着什么的更深入的描述。