我有一段相当简单的代码,我在一个函数(myFunction)中生成了一些 cv::Mat 图像并用它们填充了一个 std::vector,当向量被填充时内存使用量增加并且在向量去之后超出范围,它使用的内存按预期释放。
但出于某种原因,如果我在将 Mat 添加到向量之前执行 cv::cvtColor,则在向量超出范围后不会释放内存。 另外,如果我遍历向量并在向量超出范围之前执行 cv::imwrite 函数,内存也不会被释放。
这两个问题只会在我在 std::thead 中执行 myFunction 时出现,如果我不使用 std:thread 则根本不会出现内存泄漏。
这是我的代码:
void myFunction(){;
int x = 0;
std::vector<cv::Mat> myvector;
while(x < 1000){
cv::Mat oImage(1000, 2000, CV_8UC3, cv::Scalar(255,0,255));
//cv::cvtColor(oImage,oImage,cv::COLOR_BGR2RGB); IF I UNCOMMENT THIS LINE THE LEAK OCCURS WHEN USING STD:THREAD
myvector.push_back(oImage);
x++;
}
/* ALSO IF I DON'T EXECUTE cvtColor BUT I UNCOMMENT THESE 4 LINES THE LEAK ALSO OCCURS WHEN USING STD::THREAD
int _size = myvector.size();
for(int i = 0; i < _size; i++){
imwrite("/home/admin/test/"+std::to_string(i)+".jpg", myvector[i]);
}
*/
myvector.clear();
};
int main(int argc, char** argv)
{
int y =0;
while(y<20){
std::thread t(myFunction);
t.join();
//myFunction(); //NO PROBLEM OCCURS IF I JUST CALL THIS FUNCTION WITHOUT USING STD::THREAD
std::cout << "out of scope"; //HERE THE MEMORY SHOULD HAVE BEEN FREED
getchar();
}
return 0;
}
我正在使用 OpenCV 4.7,我认为使用 3.2.0 版本时 opencv 和线程存在问题,但现在应该已修复。