OpenCV 和 std:thread 的内存泄漏

问题描述 投票:0回答:0

我有一段相当简单的代码,我在一个函数(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 和线程存在问题,但现在应该已修复。

c++ multithreading opencv stdvector stdthread
© www.soinside.com 2019 - 2024. All rights reserved.