Mat的释放
Mat mat1 = Mat::ones(1, 5, CV_32F);
Mat mat2 = mat1; // 仅创建一个mat2信息头, mat1,mat2 数据区的地址相同
Mat mat3 = Mat::zeros(1, 4, CV_32F);
mat2.release(); // 因为mat2是对mat1的引用,这里的mat2.release()只会清除mat2的信息头和数据指针
mat1.release(); // mat1的数据区都会被释放,但是mat信息头数据还会保存(也就是还能继续被赋值)
cout << mat1 << endl;
cout << mat2 << endl;
cout << mat3 << endl << endl;
mat3.copyTo(mat1);// 拷贝会给mat1从新分配数据区域,其原来的数据区还会保留,即mat2的数据是原来mat1的数据,
//mat1 = mat3.clone(); // 最终结果是mat1和mat3的数据相同,但是数据存储空间不同, mat2存储的是mat1最初的值
mat3.release(); // mat3的释放不会影响mat1
cout << mat1 << endl;
cout << mat2 << endl;
cout << mat3 << endl << endl;
有关注释读起来比较拗口,上面的例子最好调试下。总之,对于Mat的引用(也就是浅复制,只分配信息头,数据区共享)情况下的释放,只会清除本身的信息头和置零数据区指针,不会影响被赋值的矩阵。Mat有一个引用机制,有一个成员变量refcount,会自己根据被引用和释放的次数,自动管理内存,所以一般不需要用户自己去释放。对于创建类型的构造函数(深复制),那么会有属于自己的数据区,完全和被赋值的矩阵可以独立开。