在std :: vector中释放mat

时间:2011-05-23 01:45:51

标签: c++ image opencv vector release

使用 OpenCV 2.2 ,我试图释放内存,调用发布到Mat图像 在std :: vector中,例如:

std::vector < Mat > matVec;

然而,似乎

for (int k = 0; k < matVec.size(); k++)
{

   matVec[k].release();

}

没有释放任何内存(但它仍会编译)。

我知道 OpenCV 2.2 中有新的内存管理,但我无法发现 问题。

使用IplImage*类型代替Mat(使用cvReleaseImage()而不是Mat成员函数.release())的类似示例可以正常工作。

任何提示?

2 个答案:

答案 0 :(得分:7)

.release()只应在特殊情况下调用,而不是日常使用。只需清除矢量:

std::vector<cv::Mat>().swap(matVec);

这会调用每个Mat的析构函数,释放内存(如果没有其他cv::Mat指向它 - 请记住cv::Mat,与IplImage不同,引用计数数据类型。如果在其他地方引用它,则必须清除该引用)。如果您想保留向量,但要删除内容,请将代码中的.release()行替换为:

matVec[k] = cv::Mat();

答案 1 :(得分:1)

最好的方法是激活每个matVec[k]对象的析构函数。您可以通过让matVec超出范围或将matVec定义为vector Mat*并手动分配和取消分配每个对象来实现此目的。

自OpenCV使用Mat对象的引用计数机制以来,这总是更安全,因此您不希望直接在Mat中释放数据。