Pregunta

Estoy creando una aplicación Qt 4.5 en Windows usando Visual Studio 2008. Cada vez que ejecuto mi aplicación en modo de depuración y luego la cierro, Visual Studio imprime lo siguiente en el panel de salida:

  

¡Pérdidas de memoria detectadas!
  Volcar objetos - & Gt;
  {696512} bloque normal en 0x01981AB0, 24 bytes de longitud.
  Datos: & Lt; > 00 CD CD CD 00 00 00 00 00 00 00 00 00 00 00 00
  {696511} bloque normal en 0x02E59B70, 12 bytes de longitud.
  Datos: & Lt; U2g U2g & Gt; B0 1A 98 01 E8 55 32 67 E8 55 32 67

Y la salida informa cientos de tales bloques. He notado esto particularmente cuando uso el marco Modelo / Vista de Qt 4. ¿De hecho Qt tiene pérdidas de memoria o hay circunstancias en las que Visual Studio informa incorrectamente las pérdidas?

¿Fue útil?

Solución 2

Tuve la oportunidad de perfilar mi proyecto usando DevPartner. Lo sorprendente es que informa pérdidas de memoria en QtGuid4.dll y QtCored4.dll; sin embargo, después de mirar manualmente cada caso, descubrí que todos eran falsos positivos.

Como nota al margen, no se informaron pérdidas de memoria en el código usando Qt.

Otros consejos

La información de pérdida de memoria es proporcionada por el tiempo de ejecución de Windows de depuración. Su programa puede interactuar y configurar esto.

El número entre llaves {696512} es el número de orden de asignación. Si este número es siempre el mismo, puede establecer un punto de interrupción en esta asignación pasando el número a _CrtSetBreakAlloc . Ejecute el programa en el depurador nuevamente y el depurador se detendrá cuando se asigne la memoria filtrada.

Llame a esta función temprano en main. Si el número no es siempre el mismo, intente reproducir la pérdida de memoria con código reducido hasta que sea siempre el mismo.

Para obtener más información, consulte Habilitación de detección de fuga de memoria

Asegúrese de estar usando memoria dinámica en Qt-way, por ejemplo

#include <QObject>
#include <QString>

class MyClass : public QObject
{
public: 
MyClass (const QString& text, QObject *parent = 0);
...
};


int main()
{
QObject parent;
MyClass *a;
a = new MyClass ("foo", &parent);
...
}

(c) Johan Thelin, " Fundamentos del desarrollo Qt "

Creo que esto sucede cuando el detector de fugas de memoria está buscando fugas antes de que QT realice su limpieza. Solucioné este problema moviendo mi qtmaind.lib, QtCored4.lib, QtGuid4.lib, QtOpenGLd4.lib, etc. a la parte inferior del cuadro de dependencias del vinculador en el diálogo de configuración del proyecto de VS.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top