2014-02-19 2 views
0

작업 mgr을 통해 메모리가 4kB 및 8kB 단계로 증가하지만 반드시이 순서는 아니지만 관찰되었습니다.Windows 작업 관리자에서 프로세스 메모리가 계속 증가 함을 나타냅니다.

가능한 중복 : Windows Task Manager shows process memory keeps growing even though there are no memory leaks

나는, 시간 예약을 QTimer 개체를 해제하지 않았기 때문에이 발생인지 모르겠습니다. 이 메모리 증가를 멈추는 방법과 그것이 왜 발생하는지에 대한 내 생각이 맞는지 조언 해주십시오.

mainwindow.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 

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.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); 
} 
+1

valgrind http://valgrind.org/ – Balu

+0

Qt 코드에는 메모리 누수가 없습니다. 어떻게 감지합니까? 작업 관리자는 메모리 누수를 감지하도록 설계되지 않았습니다. –

+0

@DmitrySazonov : 귀하의 의견대로 업데이트되었습니다. –

답변

2

나는 OpenCV의 익숙하지 해요,하지만이 두 라인이 발생할 것으로 보인다 너 메모리 누출 :

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

첫 번째 줄에서는 개체를 만들지 만 두 번째 줄에서는 이전 개체를 놓지 않고 다른 개체를 포인터에 할당하므로 이전 개체가 유출됩니다.

로드하는 동안 이미지가 필요합니까?

+1

첫 줄을 주석 처리하면 어떻게됩니까? 그걸 시험해 주시겠습니까? 왜냐하면 나는'cvLoadImage()'가 당신을 위해 생성과 로딩을한다고 생각하기 때문에 그것을 직접 만들 필요가 없다. 예제 (http://dasl.mem.drexel.edu/~noahKuntz/openCVTut1.html)는'cvCreateImage()'를 호출 할 필요가 없음을 확인한다. – Mousa

+0

나는 너의 충고를 따랐다. 그것은 효과가 있었다. –

관련 문제