opencv Mat引用计数详解

opencv提供两种复制的方式:深拷贝和浅拷贝
在发生拷贝构造函数和operator=函数时候,采用的是浅拷贝
copyto()和clone()函数发生的是深拷贝

那么浅拷贝是如何实现的呢?

浅拷贝发生时,比如赋值运算符。增加=两边的Mat对象的refCount引用计数器,当Mat对象析构时候,先对refCount减一,然后判断refCount的值是否为零,若为零则对data对应的内存进行释放。
那么,如何保证这些Mat的refCount值的统一呢?通过阅读源码发现,这里的refCount其实是一个指针,上面所谓的对refCount加减1,其实是*refCount 加减1。即,这些refCount指向同一个内存,因而实现了值的统一。

在路径C:\opencv2.4.9\sources\modules\core\include\opencv2\core\core.hpp文件中,列出mat的部分声明,可以发现refcount是一个 int *类型。

     int flags;
    //! the matrix dimensionality, >= 2
    int dims;
    //! the number of rows and columns or (-1, -1) when the matrix has more than 2 dimensions
    int rows, cols;
    //! pointer to the data
    uchar* data;

    //! pointer to the reference counter;
    // when matrix points to user-allocated data, the pointer is NULL
    int* refcount;

    //! helper fields used in locateROI and adjustROI
    uchar* datastart;
    uchar* dataend;
    uchar* datalimit;

你可能感兴趣的:(opencv)