0

我观察到通过任务管理器,内存以 4kB 和 8kB 的步长增加,尽管不一定按此顺序。

可能重复:Windows 任务管理器显示进程内存不断增长,即使没有内存泄漏

我不确定这是否会发生,因为我没有释放 QTimer 对象 timer2。请告诉我如何阻止这种内存增加,以及我对它发生原因的猜测是否正确。

主窗口.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QtCore>
#include <QDebug>
#include <QDateTime>
#include <QFileInfo>
#include <QString>
#include <opencv/cv.h>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>

#define TIMER2_VALUE 3000
#define UPDATED_IMAGE_STORAGE_PATH "E:\\QT1\\timeStampDateMod2\\TimeStampDateMod2\\updatedRefImg.JPG"
#define UPDATED_IMAGE_BACKUP_PATH "E:\\QT1\\timeStampDateMod2\\TimeStampDateMod2\\backUp\\updatedRefImg[%1].JPG"

using namespace std;
using namespace cv;

typedef struct
{
     QDateTime dateTimeMod1;
     QDateTime dateTimeMod2;
}tTimeMods;

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
    QTimer *timer2;
    tTimeMods findTimeModifiedStruct();
    QDateTime findTimeModified();
    void compareTimeMods(tTimeMods timeTypeFunction, QDateTime dateTimeMod2);
    QString appendWithImageName(tTimeMods timeTypeFunction);
    void shiftToRepository(QString pathString);
    void updatedImgToRepository(QString pathString);

public slots:
    void timerSlot2();

private:
    Ui::MainWindow *ui;

};

#endif // MAINWINDOW_H

主文件

#include "mainwindow.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();

    return a.exec();
}

主窗口.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"

tTimeMods timeTypeFunction, timeTypeMain;
QDateTime dateTimeMod2;

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    timeTypeMain = findTimeModifiedStruct();
    timer2 = new QTimer(this);
    connect(timer2, SIGNAL(timeout()), this, SLOT(timerSlot2()));
    timer2->start(TIMER2_VALUE);
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::timerSlot2()
{
    dateTimeMod2 = findTimeModified();
    compareTimeMods(timeTypeMain, dateTimeMod2);
    //delete timer2;
}

//tTimeMods findTimeModifiedStruct()
tTimeMods MainWindow::findTimeModifiedStruct()
{
    QString myFileName = UPDATED_IMAGE_STORAGE_PATH;
    QFileInfo info(myFileName);

    /*find last date modified*/
    timeTypeFunction.dateTimeMod1 = info.lastModified();
    timeTypeFunction.dateTimeMod2 = info.lastModified();

    qDebug()<< "dateTimeMod1: " << timeTypeFunction.dateTimeMod1.toString() << endl << "dateTimeMod2: "<< timeTypeFunction.dateTimeMod2.toString();
    return(timeTypeFunction);
}

QDateTime MainWindow::findTimeModified()
{
    QString myFileName = UPDATED_IMAGE_STORAGE_PATH;
    QFileInfo info(myFileName);

    QDateTime dateTimeMod2 = info.lastModified();
    qDebug()<< "dateTimeMod2: "<< dateTimeMod2.toString();
    return(dateTimeMod2);
}

void MainWindow::compareTimeMods(tTimeMods timeTypeFunction, QDateTime dateTimeMod2)
{
    if(dateTimeMod2 >= timeTypeFunction.dateTimeMod1)
    {
        timeTypeFunction.dateTimeMod1 = dateTimeMod2;
        QString pathString = appendWithImageName(timeTypeFunction);
        shiftToRepository(pathString);
    }
}

QString MainWindow::appendWithImageName(tTimeMods timeTypeFunction)
{
   /*appending just the timeMod with the path & image name*/
   QString path = QString(UPDATED_IMAGE_BACKUP_PATH).arg(timeTypeFunction.dateTimeMod1.toString());
   qDebug()<< "path: " << path;
   return path;
}

void MainWindow::shiftToRepository(QString pathString)
{
    updatedImgToRepository(pathString);
}

void MainWindow::updatedImgToRepository(QString pathString)
{
    pathString.replace(":","-");
    pathString.replace(1,1,":");
    qDebug()<<"pathString now: "<<pathString;

    /*convert QString into char* */
    QByteArray pathByteArray = pathString.toLocal8Bit();
    const char *path = pathByteArray.data();

    IplImage *InputImg = cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,3);
    InputImg = cvLoadImage(UPDATED_IMAGE_STORAGE_PATH ,CV_LOAD_IMAGE_UNCHANGED);

    /*save the image*/
    cvSaveImage(path,InputImg);
    cvReleaseImage(&InputImg);
}
4

1 回答 1

2

我不熟悉 OpenCV,但似乎这两行会导致内存泄漏:

IplImage *InputImg = cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,3);
InputImg = cvLoadImage(UPDATED_IMAGE_STORAGE_PATH ,CV_LOAD_IMAGE_UNCHANGED);

在第一行中,您正在创建一个对象,但在第二行中,您将另一个对象分配给指针而不释放前一个对象,因此前一个对象被泄露。

当您要加载图像时,甚至需要创建图像吗?

于 2014-02-19T11:08:22.220 回答