使用OpenCV 2.2,我试图通过调用Mat映像的release来释放内存在std::矢量内部,例如:
std::vector < Mat > matVec;
然而,它看起来像
for (int k = 0; k < matVec.size(); k++)
{
matVec[k].release();
}
没有释放任何内存(不过它仍在编译)。
我知道OpenCV 2.2中有新的内存管理,但我无法发现问题
使用IplImage*
类型代替Mat(使用cvReleaseImage()
代替Mat成员函数.release()
)的类似示例也可以正常工作。
有什么提示吗?
.release()
只能在特殊情况下调用,不适用于日常使用。只需清除矢量:
std::vector<cv::Mat>().swap(matVec);
这会调用每个Mat
的析构函数,释放内存(如果没有其他cv::Mat
指向它,请记住,与IplImage
不同,cv::Mat
是一个引用计数的数据类型。如果它在其他地方被引用,您也必须清除该引用)。如果您想保留矢量,但要去掉内容,请将代码中的.release()
行替换为:
matVec[k] = cv::Mat();
最好的方法是激活每个matVec[k]
对象的析构函数。您可以让matVec
脱离范围,或者将matVec
定义为Mat*
的vector
,然后手动分配和解除分配每个对象。
这总是更安全的,因为OpenCV对Mat
对象使用引用计数机制,因此您不想直接解除分配Mat
中的数据。