cv :: Mat的发布方法

Bry*_*yan 5 c++ free opencv mat

我想确认cv::Mat::release()方法是否类似于free()C编程,即它从内存中释放Matrix数据.

特别是,我想了解这个方法在内存泄漏方面的行为,并确保may程序中没有泄漏.

Dan*_*tín 6

如果引用计数器等于1,则是,cv::Mat::release()将其减少为零并释放结构(如freeC中).

如果参考计数大于一(即有一些其他对象感兴趣的结构),然后cv::Mat::release()递减引用计数器.

您可以cv::Mat通过调用cv::Mat::addref()方法来递增结构的引用计数器(即,标记您对它感兴趣并且不希望它被释放).


Yam*_*our 6

您不必手动解除分配 cv::Mat 对象,因为它是自动管理的,除非您已经从 Iplimage 初始化了 Mat,在这种情况下您应该手动解除分配它 deallocate()。

请参阅此线程。

openCV 将 IplImage 与 cv::Mat 混合


kil*_*tek 5

我使用这样的代码结构(OpenCV with C++)出现内存泄漏:

int i;
while(true){
    Mat x = imread("C:/pics"+i+".jpg");
    //do something with x
}
Run Code Online (Sandbox Code Playgroud)

经过 100 次左右的迭代后,它总是崩溃,然后我将代码更改为:

int i;
while(true){
    Mat x = imread("C:/pics"+i+".jpg");
    //do something with x
    x.refcount = 0;
    x.release();
}
Run Code Online (Sandbox Code Playgroud)

它停止了崩溃并进行了完整的迭代。但是当手动将 refcount 设置为 0 时,您必须非常确定您不再需要该对象。这可能是有人对我的答案投反对票的原因,但我使用这种方法解决了我的问题。那我为什么不分享呢?