Qt Windows任务管理器显示进程内存持续增长

Qt Windows任务管理器显示进程内存持续增长,qt,memory-leaks,destructor,delete-operator,qtimer,Qt,Memory Leaks,Destructor,Delete Operator,Qtimer,我观察到,通过task mgr,内存以4kB和8kB的步长增加,尽管不一定是按这个顺序增加 可能重复: 我不确定是否发生了这种情况,因为我没有释放QTimer对象timer2。请告诉我如何停止这种记忆增长,以及我对其原因的猜测是否正确 主窗口 #ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QMainWindow> #include <QtCore> #include <QDebug> #include

我观察到,通过task mgr,内存以4kB和8kB的步长增加,尽管不一定是按这个顺序增加

可能重复:

我不确定是否发生了这种情况,因为我没有释放QTimer对象timer2。请告诉我如何停止这种记忆增长,以及我对其原因的猜测是否正确

主窗口

#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
\ifndef主窗口
#定义主窗口
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#定义时间2_值3000
#定义更新的\u映像\u存储\u路径“E:\\QT1\\TIMESTANDATEMOD2\\TIMESTANDATEMOD2\\updatedRefImg.JPG”
#定义更新的\u映像\u备份\u路径“E:\\QT1\\TIMESTANDATEMOD2\\TIMESTANDATEMOD2\\BACKUP\\updatedRefImg[%1]。JPG”
使用名称空间std;
使用名称空间cv;
类型定义结构
{
QDateTime dateTimeMod1;
QDateTime dateTimeMod2;
}TTI备忘录;
名称空间用户界面{
类主窗口;
}
类主窗口:公共QMainWindow
{
Q_对象
公众:
显式主窗口(QWidget*parent=0);
~main窗口();
QTimer*timer2;
TTIMods findTimeModifiedStruct();
QDateTime findTimeModified();
void compareTimeMods(tTimeMods timeTypeFunction,QDateTime dateTimeMod2);
QString appendWithImageName(TTIMomeds timeTypeFunction);
void shiftToRepository(QString路径字符串);
void updatedImgToRepository(QString路径字符串);
公众时段:
void timerSlot2();
私人:
Ui::MainWindow*Ui;
};
#endif//main窗口
main.cpp

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

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

    return a.exec();
}
#包括“mainwindow.h”
#包括
int main(int argc,char*argv[])
{
质量保证申请a(argc、argv);
主窗口w;
w、 show();
返回a.exec();
}
mainwindow.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);
}
#包括“mainwindow.h”
#包括“ui_main window.h”
TTIMods timeTypeFunction,timeTypeMain;
QDateTime dateTimeMod2;
主窗口::主窗口(QWidget*父窗口):
QMainWindow(父级),
用户界面(新用户界面::主窗口)
{
用户界面->设置用户界面(此);
timeTypeMain=findTimeModifiedStruct();
timer2=新的QTimer(此);
连接(timer2,信号(timeout()),此,插槽(timerSlot2());
timer2->start(timer2\u值);
}
MainWindow::~MainWindow()
{
删除用户界面;
}
void主窗口::timerSlot2()
{
dateTimeMod2=findTimeModified();
比较备忘录(timeTypeMain、dateTimeMod2);
//删除计时器2;
}
//TTIMods findTimeModifiedStruct()
TTIMods主窗口::findTimeModifiedStruct()
{
QString myFileName=更新的\图像\存储\路径;
QFileInfo信息(myFileName);
/*查找修改的最后日期*/
timeTypeFunction.dateTimeMod1=info.lastModified();
timeTypeFunction.dateTimeMod2=info.lastModified();

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

IplImage *InputImg = cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,3);
InputImg = cvLoadImage(UPDATED_IMAGE_STORAGE_PATH ,CV_LOAD_IMAGE_UNCHANGED);
在第一行中,您正在创建一个对象,但在第二行中,您正在为指针分配另一个对象,而没有释放前一个对象,因此前一个对象会泄漏


当您要加载映像时,是否需要创建映像?

valgrind Qt代码中没有内存泄漏。如何检测它们?任务管理器不是为检测内存泄漏而设计的。@DmitrySazonov:问题根据您的注释进行更新。Vargind在Windows中不起作用。如果您注释掉第一行,会发生什么情况?您能测试一下吗这对我来说?因为我认为
cvLoadImage()
为您创建和加载,您不需要自己创建。示例()还确认您不需要调用
cvCreateImage()