2009-06-17 3 views
1

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

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

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

+6

Возможно также, что ваш код имеет утечку памяти ... – sth

+0

Вы освобождаете каждый выделенный ресурс или вы просто позволяете процессу выйти (в этом случае утечка по дизайну - как правило, по соображениям производительности)? –

+1

Одна из памяти «gotcha». Я видел, как люди получают то, что модели не принадлежат взгляду. Было бы бессмысленно иметь их в виду в большинстве случаев, но если вы не думаете об этом, вы можете быть уверены, что установка модели для представления задает представление как родителя модели. Это может вызвать утечку памяти. –

ответ

2

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

В качестве побочного примечания в коде с использованием Qt не было утечек памяти.

1

Убедитесь, что вы используете динамическую память в 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); 
... 
} 

(с) Йохан Thelin, "Основы Qt развития"

+0

@MadH: Да, я правильно определил все объекты Qt, как вы упомянули. Для классов, которые не наследуют QObject, я использую интеллектуальные указатели Boost. Поэтому у меня есть только несколько объектов, память которых я сам управляю. – Krsna

+0

@ Krsna, тогда было бы интересно узнать ответ ;-) – MadH

4

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

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

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

Для получения дополнительной информации см Memory Leak Detection Enabling

0

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