При закрытии приложения Qt 4.5 Visual Studio сообщает, что обнаружены утечки памяти - PullRequest
1 голос
/ 17 июня 2009

Я создаю приложение Qt 4.5 в Windows с использованием Visual Studio 2008. Всякий раз, когда я запускаю свое приложение в режиме отладки и затем закрываю его, Visual Studio выводит на панель вывода следующее:

Обнаружены утечки памяти!
Сброс объектов ->
{696512} нормальный блок 0x01981AB0 длиной 24 байта.
Данные: <> 00 CD CD CD 00 00 00 00 00 00 00 00 00 00 00 00
{696511} нормальный блок в 0x02E59B70, длиной 12 байт.
Данные: B0 1A 98 01 E8 55 32 67 E8 55 32 67

И вывод сообщает о сотнях таких блоков. Я особенно это заметил, когда использовал Qt 4 Model / View Framework. Есть ли у Qt утечки памяти или есть обстоятельства, при которых Visual Studio неверно сообщает об утечках?

Ответы [ 4 ]

4 голосов
/ 18 июня 2009

Информация об утечке памяти предоставляется средой выполнения отладочных окон. Ваша программа может взаимодействовать и настраивать это.

Число в скобках {696512} - это номер заказа на распределение. Если это число всегда одинаково, вы можете установить точку останова для этого распределения, передав число в _CrtSetBreakAlloc. Запустите программу в отладчике снова, и отладчик остановится, когда будет выделена утечка памяти.

Вызовите эту функцию на раннем этапе main. Если число не всегда одно и то же, попробуйте воспроизвести утечку памяти с уменьшенным кодом, пока она не будет всегда одинаковой.

Для получения дополнительной информации см. Включение обнаружения утечки памяти

2 голосов
/ 27 июля 2009

У меня была возможность профилировать свой проект с помощью DevPartner. Удивительно, что он сообщает об утечках памяти в QtGuid4.dll и QtCored4.dll; однако, вручную изучив каждый случай, я обнаружил, что все они были ложными срабатываниями.

Как примечание: в коде с использованием Qt не сообщалось об утечках памяти.

1 голос
/ 18 июня 2009

Убедитесь, что вы используете динамическую память в Qt-way, например,

#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) Йохан Телин, "Основы разработки Qt"

0 голосов
/ 04 сентября 2009

Я думаю, что это происходит, когда детектор утечки памяти проверяет утечки, прежде чем QT выполнит его очистку.Я исправил эту проблему, переместив мои qtmaind.lib, QtCored4.lib, QtGuid4.lib, QtOpenGLd4.lib и т. Д. В конец поля зависимостей компоновщика в диалоговом окне настроек проекта VS.

...