Gestión de memoria Qt y el método para localizar la ubicación de la fuga de memoria después de la fuga

Mecanismo de gestión de memoria Qt

Qt utiliza las relaciones padre-hijo de objetos para la gestión de la memoria. Al crear un objeto de la clase, especifique el puntero del objeto principal para el objeto. Cuando el objeto principal se destruye y libera en un momento determinado, el objeto principal atravesará todos sus objetos secundarios primero, y destruirá y liberará los objetos secundarios uno por uno.

Ejemplo de código de gestión de memoria Qt

QLabel *label = new QLabel;

Aquí está el control de etiqueta que creé en el código fuente. No se especifica ningún objeto principal. Debe liberar la memoria manualmente. Si no la libera, habrá una pérdida de memoria.

QLabel *label = new QLabel();

Aquí está el control de etiqueta que creé en el código fuente. Ejecuta el constructor de QLabel sin especificar el objeto principal. Debe liberar la memoria manualmente. Si no la libera, habrá una pérdida de memoria.

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

El objeto principal está configurado, no solo se puede mostrar en la ventana principal, sino que también puede ayudar a liberar memoria automáticamente

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

El modelo solo se establece aquí, y el control ui no es el objeto principal del modelo, lo que no puede ayudar al itemModel a liberar memoria;

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

Aquí, el modelo ha realizado una operación clara, que ayudará a liberar la memoria ocupada por el elemento debajo del modelo y no liberará la memoria del modelo;

MyWidget *myWidget = new MyWidget;

La interfaz creada por usted mismo también necesita liberar el espacio de memoria manualmente;

Cómo localiza Qt la ubicación de la fuga de memoria

Visual Leak Detector (VLD) es una herramienta gratuita de detección de fugas de memoria para Visual C++. La ubicación de la fuga de memoria se puede detectar mediante VLD. VLD admite el compilador MSVC y no admite el compilador MingGW. Cómo usar VLD:
Descárguelo desde aquí. Después de la descarga, puede ver el archivo de inclusión y el archivo lib de VLD. No necesita descargar el exe de Internet.
Archivos de programación de detección de fugas de memoria VLD, incluidos archivos de encabezado, archivos de biblioteca, archivos de configuración

Instrucciones

En el archivo del proyecto, agregue el archivo de inclusión correspondiente y el archivo lib, y los pasos específicos no se explicarán en detalle.
1. Agregue el archivo de encabezado

#include "vld.h"

2. Coloque vld.ini en el mismo directorio que el archivo exe generado
inserte la descripción de la imagen aquí

vld.ini es el texto de configuración de VLD. De forma predeterminada, se lee el archivo vld.ini en el directorio de instalación. Cuando también hay un archivo vld.ini en el directorio donde se encuentra el exe, esta configuración se leerá primero.

Descripción de la configuración del parámetro vld.ini
De forma predeterminada, se lee el archivo vld.ini en el directorio de instalación.Cuando también hay un archivo vld.ini en el directorio donde se encuentra el exe, esta configuración se leerá primero.

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 。

Abra el exe, después de que finalice la operación, cierre el exe, puede ver el informe VLD, que contiene varios contenidos:

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

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

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

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

inserte la descripción de la imagen aquí

Algunos problemas encontrados y soluciones.

No hay posicionamiento de función detrás de la pila de llamadas (TID), por ejemplo:
inserte la descripción de la imagen aquí
simplemente modifique ReportEncoding = ascii en el archivo ini, ascii es unicode, y puede ver el código fuente para ubicar la ubicación de la fuga después de ejecutar el programa nuevamente;
inserte la descripción de la imagen aquí
para usar VLD en modo de lanzamiento, las macros deben programarse antes que el archivo de encabezado vld.h (ver Problemas de VLD 46)

#define VLD_FORCE_ENABLE
#include "vld.h"

Supongo que te gusta

Origin blog.csdn.net/qq_43376782/article/details/130194324
Recomendado
Clasificación