使用opencv imwrite发生内存泄漏

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

我正在尝试将流中的帧写入USB格式为.jpg的外部硬盘。但是我在运行此C ++程序时观察到内存泄漏。有趣的一点是,当我覆盖相同的图像文件(名称和路径相同)时,没有看到内存泄漏,但是我为每个传入的帧写入了新文件(新名称和路径)时,计算机的RAM被填满。我使用的是在程序开始时初始化的单个cv :: Mat,并将每个传入的帧存储在该Mat中。然后使用cv :: imwrite将Mat写入磁盘。我不知道为什么会这样。你们能建议点什么吗?

这里是代码:

#include "opencv2/opencv.hpp"
#include <iostream>

using namespace std;
using namespace cv;

int main(){

  VideoCapture cap("testVid.mp4"); 

  if(!cap.isOpened()){
    cout << "Error opening video stream or file" << endl;
    return -1;
  }
  Mat *writeMat = new Mat();
  int frame_num = 0;    
  while(1){
    cap >> *writeMat;
    if (writeMat->empty())
      break;

    char *imageName = new char[64];

    //Storage mounted at /mnt/disk1
    sprintf(imageName, "/mnt/disk1/%07d.jpg", frame_num);

    imwrite(imageName, *writeMat); 
    delete imageName;
  }

  cap.release();
  delete writeMat;
  writeMat = NULL;  
  return 0;
}
c++ opencv memory-management memory-leaks
1个回答
0
投票

很可能是内存泄漏是由于您分配了一个数组(char *imageName = new char[64]),但没有使用特定于数组的删除调用来删除它:delete [] imageName;

您无需在此处动态分配。由于您正在使用循环的局部变量,因此您可以简单地执行以下操作:

{
    // ...
   char imageName[64];

// imageName will be cleaned up when unscoped from the current loop
}
© www.soinside.com 2019 - 2024. All rights reserved.