矩阵(dis)分配 我使用OpenCV C++ API进行计算机视觉应用,并用CV::Mat结构管理矩阵。Opencv使用引用计数将创建的对象释放为cv::Mat。 我还使用libshogun来实现更具体的机器学习算法。幕府有自己的矩阵结构,称为SGMatrix。 我从cv::Mat初始化SGMatrix,如下所示: cv::Mat cvmat(100,100,CV_32FC1,cv::Scalar(0.0)); SGMatrix<float> sgmatrix((float*)cvmat.data, cvmat.rows, cvmat.cols); cv::Mat cvmat(100100,cv_32FC1,cv::Scalar(0.0)); SGMatrix SGMatrix((float*)cvmat.data,cvmat.rows,cvmat.cols);

矩阵(dis)分配 我使用OpenCV C++ API进行计算机视觉应用,并用CV::Mat结构管理矩阵。Opencv使用引用计数将创建的对象释放为cv::Mat。 我还使用libshogun来实现更具体的机器学习算法。幕府有自己的矩阵结构,称为SGMatrix。 我从cv::Mat初始化SGMatrix,如下所示: cv::Mat cvmat(100,100,CV_32FC1,cv::Scalar(0.0)); SGMatrix<float> sgmatrix((float*)cvmat.data, cvmat.rows, cvmat.cols); cv::Mat cvmat(100100,cv_32FC1,cv::Scalar(0.0)); SGMatrix SGMatrix((float*)cvmat.data,cvmat.rows,cvmat.cols);,c++,opencv,memory-management,shogun,C++,Opencv,Memory Management,Shogun,我的问题是当我在幕府文库中使用另一个对象时,比如: CSimpleFeatures<float>* features = new CSimpleFeatures<float>(sgmatrix); CSimpleFeatures*features=新的CSimpleFeatures(sgmatrix); 如果幕府现在应该拥有使用功能创建的矩阵,那么在运行时,当opencv尝试释放幕府已经发布的cvmat时,我会遇到一个错误。 我该怎么办?我不想克隆我的矩阵。在Open

我的问题是当我在幕府文库中使用另一个对象时,比如:

CSimpleFeatures<float>* features = new CSimpleFeatures<float>(sgmatrix);
CSimpleFeatures*features=新的CSimpleFeatures(sgmatrix);
如果幕府现在应该拥有使用
功能创建的矩阵,那么在运行时,当opencv尝试释放幕府已经发布的
cvmat
时,我会遇到一个错误。
我该怎么办?我不想克隆我的矩阵。

在OpenCV之外为矩阵内部分配内存,可以使用幕府将军或new/malloc。然后,使用其中一个构造函数创建矩阵,该构造函数将指向矩阵数据(之前已分配)的
void*
指针作为参数。这将为您的数据创建一个opencv头


这样,opencv知道它不拥有矩阵内部的数据,并且在释放
cv::Mat
对象时,它不会尝试释放该数据。

使用幕府或new/malloc为opencv外部的矩阵内部分配内存。然后,使用其中一个构造函数创建矩阵,该构造函数将指向矩阵数据(之前已分配)的
void*
指针作为参数。这将为您的数据创建一个opencv头


这样,opencv知道它不拥有矩阵中的数据,并且在释放
cv::Mat
对象时不会尝试释放它。

幕府将在SGMatrix和simplefeature对象被销毁后立即取消分配矩阵。为了避免这种使用

SGMatrix<float> sgmatrix((float*)cvmat.data, cvmat.rows, cvmat.cols, false);
SGMatrix SGMatrix((float*)cvmat.data,cvmat.rows,cvmat.cols,false);

这样,您就必须处理内存释放

一旦SGMatrix和simplefeature对象被销毁,幕府将军将立即取消分配矩阵。为了避免这种使用

SGMatrix<float> sgmatrix((float*)cvmat.data, cvmat.rows, cvmat.cols, false);
SGMatrix SGMatrix((float*)cvmat.data,cvmat.rows,cvmat.cols,false);

这样,您就必须处理内存释放

注意:我试图将ref添加到cvmat对象,但得到了相同的错误。来自幕府将军,而非opencv。***glibc检测到***/home/eric/dev/(…):双重释放或损坏(out):0x0000000000a2f1c0***=========================/usr/local/lib/libshogun.so.12注意:我试图向cvmat对象添加ref,但收到相同的错误。来自幕府将军,而非opencv。***glibc检测到***/home/eric/dev/(…):双重释放或损坏(out):0x0000000000a2f1c0***==================================/usr/local/lib/libshogun.so.12实际上,您有两个问题(一个是幕府的虚假释放,一个是“如何防止opencv释放我的有用数据”)。我有问题2的答案,还需要找到问题1的答案。。。也许幕府正在修改你背后的数据,或者删除标题中的一些opencv字段,然后opencv识别出一些错误。好吧,实际上你有两个问题(一个是幕府的虚假解除分配,一个是“如何防止opencv发布我的有用数据”)。我有问题2的答案,还需要找到问题1的答案。。。也许幕府将军正在修改你背后的数据,或者删除标题中的一些opencv字段,然后opencv识别出一些错误。