Qt 메모리 관리 및 메모리 누수 후 위치 찾기 방법

Qt 메모리 관리 메커니즘

Qt는 메모리 관리를 위해 개체 부모-자식 관계를 사용합니다. 클래스의 개체를 만들 때 해당 개체에 대한 상위 개체 포인터를 지정합니다. 부모 개체가 특정 순간에 파괴되고 해제되면 부모 개체는 먼저 모든 자식 개체를 순회하고 자식 개체를 하나씩 파괴하고 해제합니다.

Qt 메모리 관리 코드 예제

QLabel *label = new QLabel;

다음은 제가 소스코드에서 생성한 레이블컨트롤입니다.부모객체가 지정되지 않았습니다.메모리를 수동으로 해제해야 합니다.해제하지 않으면 메모리 누수가 발생합니다.

QLabel *label = new QLabel();

다음은 제가 소스코드에서 생성한 레이블컨트롤입니다.부모객체를 지정하지 않고 QLabel의 생성자를 실행합니다.메모리를 수동으로 해제해야 합니다.해제하지 않으면 메모리 누수가 발생합니다.

QLabel *label = new QLabel;
label->setParent(this);

부모 개체가 설정되면 부모 창에 표시될 수 있을 뿐만 아니라 자동으로 메모리 해제를 도울 수 있습니다.

QStandardItemModel *itemModel = new QStandardItemModel;
ui.tableView->setModel(itemModel);

모델은 여기에서만 설정되며 ui 컨트롤은 모델의 부모 개체가 아니므로 itemModel이 메모리를 해제하는 데 도움이 되지 않습니다.

QStandardItem *item = new QStandardItem;
itemModel->setItem(1,item);
itemModel->clear();

여기에서 모델은 명확한 작업을 수행하여 모델 아래 항목이 차지하는 메모리를 해제하는 데 도움이 되며 모델의 메모리를 해제하지 않습니다.

MyWidget *myWidget = new MyWidget;

직접 만든 인터페이스도 메모리 공간을 수동으로 해제해야 합니다.

Qt가 메모리 누수 위치를 찾는 방법

VLD(Visual Leak Detector)는 Visual C++용 무료 메모리 누수 감지 도구입니다. 메모리 누수 위치는 VLD를 사용하여 감지할 수 있습니다. VLD는 MSVC 컴파일러를 지원하며 MingGW 컴파일러는 지원하지 않습니다. VLD 사용법 :
여기에서 다운로드 받으시면 VLD의 include 파일과 lib 파일을 보실 수 있습니다 인터넷에서 exe를 다운 받으실 필요가 없습니다.
헤더 파일, 라이브러리 파일, 구성 파일을 포함한 VLD 메모리 누수 감지 프로그래밍 파일

지침

프로젝트 파일에서 해당 include 파일과 lib 파일을 추가하고 구체적인 단계는 자세히 설명하지 않습니다.
1. 헤더 파일에 추가

#include "vld.h"

2. 생성된 exe 파일과 동일한 디렉토리에 vld.ini를 배치합니다.
여기에 이미지 설명 삽입

vld.ini는 VLD의 설정 텍스트로, 기본적으로 설치 디렉터리에 있는 vld.ini 파일을 읽으며, exe가 있는 디렉터리에 vld.ini 파일도 있으면 이 설정을 먼저 읽습니다.

vld.ini 파라미터 설정 설명
기본적으로 설치 디렉터리에 있는 vld.ini 파일을 읽는데, exe가 있는 디렉터리에 vld.ini 파일도 있으면 이 구성을 먼저 읽습니다.

VLD:选择VLD的打开与关闭。在Debug模式下运行,关闭以后会有一行
VLD关闭的提示信息。默认为 on。

AggregateDuplicates:设置为 yes 时,相同地方产生内存泄漏只输
出一次,但是会统计发生的次数。默认是 no 。

MaxDataDump:输出的dump数据个数,默认为 256。

MaxTraceFrames:输出的调用栈的层数。默认是 64。

ReportEncoding :report 文件的编码格式,可选有 
ascii, unicode,默认是 ascii 。

ReportFile :report 文件的路径。默认是
 “.\memory_leak_report.txt”

ReportTo :可选有 debugger, file, both,debugger 
表示输出到 debug模式下的输出窗口;file 表示只输出到文件中;
 both顾名思义,全都都输出。默认是 debugger 。

exe를 열고 작업이 끝난 후 exe를 닫으면 여러 내용이 포함된 VLD 보고서를 볼 수 있습니다.

【Block X at …: Y bytes】:第X个块(new)泄漏了Y个字节;

【Call Stack】泄漏内存的堆栈信息,对应的行便是具体的代码位置;

【Data】泄漏内存的数据信息;

【Visual Leak Detector detected X memory leak (Y bytes).】总共 X 处泄漏,共泄漏字节数 Y 字节;

여기에 이미지 설명 삽입

발생한 몇 가지 문제 및 해결 방법

호출 스택(TID) 뒤에 함수 포지셔닝이 없습니다. 예를 들어
여기에 이미지 설명 삽입
ini 파일에서 ReportEncoding = ascii를 수정하면 됩니다
여기에 이미지 설명 삽입
. 릴리스 모드의 VLD, 매크로는 헤더 파일 vld.h 이전에 예약되어야 합니다(VLD 문제 46 참조).

#define VLD_FORCE_ENABLE
#include "vld.h"

추천

출처blog.csdn.net/qq_43376782/article/details/130194324