Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/141.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ cv::Mat';s释放法_C++_Opencv_Free_Mat - Fatal编程技术网

C++ cv::Mat';s释放法

C++ cv::Mat';s释放法,c++,opencv,free,mat,C++,Opencv,Free,Mat,我想确认cv::Mat::release()方法是否类似于C编程中的free(),即它从内存中释放矩阵数据 特别是,我想了解此方法在内存泄漏方面的行为,并确保在5个程序中没有泄漏。如果引用计数器等于1,则是,cv::Mat::release()将其递减为零并取消分配结构(如C中的free) 如果引用计数器大于一(即,结构中还有其他对象感兴趣),则cv::Mat::release()将仅递减引用计数器 您可以通过调用cv::Mat::addref()方法来增加cv::Mat结构的引用计数器(即,标

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


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

如果引用计数器等于1,则是,
cv::Mat::release()
将其递减为零并取消分配结构(如C中的
free


如果引用计数器大于一(即,结构中还有其他对象感兴趣),则
cv::Mat::release()
将仅递减引用计数器


您可以通过调用
cv::Mat::addref()
方法来增加
cv::Mat
结构的引用计数器(即,标记您对它感兴趣并且不希望它被解除分配)。

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

请参考此线程


我使用这样的代码结构(OpenCV与C++)时发生内存泄漏:

在大约100次迭代之后,它总是崩溃,然后我将代码更改为:

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

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

下面的程序片段测试了Mat::release()的行为 (改编自)

使用名称空间std;
使用名称空间cv;
int main(int argc,字符**argv){

不能将代码封装在一段时间内(true){//loop}并让它运行。同时,使用任务管理器监视内存,以对内存进行推理。有一些特定的工具可以测量内存泄漏和其他编程错误(使用未初始化的变量等)。看看«valgrind»。我有一个cv::Mat v,即v.create()在一个循环中,v的大小对于不同的迭代是不同的。然后对于下一个迭代,我想删除旧的以创建新的。我可以使用release()或deallocate()吗?你能解释一下你投反对票的原因吗?是因为你没有领会我的观点吗?如果在最后一个例子中你展示了一种释放内存的方法,那就太好了,我想是通过释放imgRef然后再释放img…?什么是指作物?比如
Mat imgRef=img(roi)
如果我随后释放
img,然后尝试同时释放imgRef,会发生什么?
int i;
while(true){
    Mat x = imread("C:/pics"+i+".jpg");
    //do something with x
    x.refcount = 0;
    x.release();
}
using namespace std;
using namespace cv;

int main(int argc, char **argv) {
    cout << "test_mat_release.cpp" << endl;

    {
        //memory is released
        const char *pzInputImg = "data/em_sample.png";

        Mat img;
        img = imread(pzInputImg);
        assert(img.data);
        img.release();
        assert(!img.data);
    }
    {
        //memory is released
        Mat img(100, 100, CV_32FC1);
        assert(img.data);
        img.release();
        assert(!img.data);
    }

    {   
        //Since Mat does not owns data , data is not released
        //you have to explicitly release data
        int cols=17;
        int rows=15;
        unsigned char * data = new unsigned char[rows*cols*3];
        Mat img(rows, cols, CV_8UC3, data);
        assert(img.data);
        img.release();
        assert(!img.data);
        delete [] data;
    }



    Mat imgRef;
    {
        //memory is not released
        //since there img.data is now shared with imgRef
        Mat img(100, 100, CV_32FC1);
        imgRef=img;
        assert(img.data);
        assert(img.data == imgRef.data);
        img.release();
        assert(img.empty());
        assert(!img.data);
        //img.data is NULL, but imgRef.data is not NULL, so data is not de-allocated
        assert(!imgRef.empty());
        assert(imgRef.data);
    }
    return 0;
}