2015. 11. 10. 02:53

0054 - Dr. Memory 로 메모리 누수 확인하기

윈도우의 Visual Studio 에서는 Visual Leak Detector 사용하거나 리눅스의 QT Creator 에서는 Valgrind 를 사용하면 비교적 메모리 누수를 쉽게 찾을 수 있지만, 중간에 위치한 윈도우의 QT Creator 에서 메모리 누수를 찾는데는 기본으로 제공되는 Tool 들로는 찾기가 쉽지 않습니다.

서드 파티 툴인 닥터 메모리 (Dr. Memory) 를 사용하여 메모리 누수를 찾는 방법을 설명 드리겠습니다. 사용법은 경험 했던 다른 메모리 누수 도구들에 비해 아주 간편한 편입니다.

1. http://www.drmemory.org/ 에 가서 프로그램을 설치 합니다. 접근이 어려우면 아래 압축된 파일을 받아서 푼 뒤 설치 합니다.

DrMemory-Windows-1.9.0-4.z01
DrMemory-Windows-1.9.0-4.z02
DrMemory-Windows-1.9.0-4.z03
DrMemory-Windows-1.9.0-4.zip

2. 프로그램을 설치하면 아래와 같이 바탕 화면에 진단 도구 아이콘이 나타납니다.

실수로 진단 아이콘이 삭제 되어도 해당 실행 파일 (drmemory.exe) 을 바로가기 아이콘으로 만들어 사용하면 됩니다.

3. 메모리 누수 여부를 확인 하기 위해 예제 프로그램을 작성해 봅니다.

1) Project 생성

File - New File or or Project

Application -Qt Widgets Application

Name - untitile

Kit Selection - Desktop Qt 5.5.0 MinGW 32bit

Class Information - 그대로

Finish

2) Code 수정

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include "mainwindow.h"
#include <QApplication>
#include <QDialog>
 
// main.cpp
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();
 
    QDialog *test = new QDialog();
    test->show();
 
    return a.exec();
}
 
cs

Delete 없이 QDialog 객체를 동적으로 할당하여 실행 File 을 만들어 봅니다.

3) 끌어 넣어서 실행 후 결과 확인




결과 화면을 보면 5326 바이트의 누수가 있다는 것을 볼 수 있습니다.

4) 코드 교정 후 결과 확인

상위 창이 닫힐 때 자동으로 소멸자가 생성되는 지난 시간의 코드와 달리, 마법사를 사용하지 않고 직접 생성 했기에 이번에는 종료까지 직접 설정해야 합니다.

메모리 반환은 몇가지 방법이 있겠지만, 이번에는 Qt::WA_DeleteOnClose 속성을 객체에 부여하여 종료시 자동으로 반환하게 설정합니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// main.cpp
#include "mainwindow.h"
#include <QApplication>
#include <QDialog>
 
 
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();
 
    QDialog *test = new QDialog();
    test->setAttribute(Qt::WA_DeleteOnClose);
    test->show();
 
    return a.exec();
}
 
cs

실행 화면은 동일하지만, 보고서 내용은 다르게 나옵니다.

핸들/메모리 누수는 반복 수행시 의도치 않은 종료를 만들기 때문에 주의해서 관리하는게 좋습니다.

작업 파일

untitled.zip