При закрытии приложения Qt 4.5 Visual Studio сообщает об обнаружении утечки памяти.

Я создаю приложение 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 байт.
Данные: ‹U2g U2g> B0 1A 98 01 E8 55 32 67 E8 55 32 67

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


person Krsna    schedule 17.06.2009    source источник
comment
Также может быть вероятность того, что в вашем коде есть утечки памяти ...   -  person sth    schedule 17.06.2009
comment
Освобождаете ли вы каждый выделенный ресурс или просто позволяете процессу завершиться (в этом случае утечка является преднамеренной - обычно из соображений производительности)?   -  person Robert Horvick    schedule 17.06.2009
comment
Одна из замеченных мною ловушек с памятью у людей заключается в том, что модели не принадлежат представлению. В большинстве случаев было бы бессмысленно владеть ими для представления, но если вы не задумываетесь об этом, вы можете поверить, что установка модели для представления устанавливает, что представление является родительским для модели. Это могло вызвать утечку памяти.   -  person Caleb Huitt - cjhuitt    schedule 17.06.2009
comment
@sth: Конечно, это возможно. :) Однако Qt имеет свой собственный механизм управления памятью, который я широко использую во всем приложении. По сути, когда создается новый класс на основе QObject, вы передаете другой QObject / QWidget (два общих базовых класса в Qt) его конструктору в качестве родителя нового объекта. После вызова деструктора родителя он вызывает деструктор для всех своих дочерних элементов. Вот подробности: doc.trolltech.com/4.5/objecttrees.html   -  person Krsna    schedule 18.06.2009


Ответы (4)


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

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

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

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

person iain    schedule 18.06.2009

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

Кстати, в коде, использующем Qt, утечек памяти не было.

person Krsna    schedule 27.07.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»

person MadH    schedule 18.06.2009
comment
@MadH: Да, я правильно поставил все объекты Qt, как вы упомянули. Для классов, которые не наследуют QObject, я использую интеллектуальные указатели Boost. Так что у меня есть только несколько объектов, памятью которых я управляю сам. - person Krsna; 18.06.2009
comment
@Krsna, тогда интересно было бы узнать ответ ;-) - person MadH; 24.06.2009

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

person Community    schedule 04.09.2009